如何组合来自同一个表的两个结果

时间:2014-11-13 16:18:54

标签: sql select group-by

我正在寻找一种从交易表中提取总计的方法。销售和退货交易按列进行区分,但值始终存储为正数。

我设法将按产品分组的不同交易类型总计拉为单独的行:

SELECT `type`, 
        `product`, 
        sum(`final_price`) AS `value`,
        count(`final_price`) AS `count`
GROUP BY `product`, `type`

结果是:

Type | Product | Value | Count
S    | 1       | 1000  | 2    
S    | 4       | 750   | 3    
S    | 2       | 300   | 2    
S    | 3       | 10    | 1    
R    | 1       | 500   | 1    

理想情况下,我希望将总数显示在一行中,但在其他列中显示不同的列以便进行排序。理想的结果是:

Type | Product | s_value | s_count | r_value | r_count
S    | 1       | 1000    | 2       | 500     | 1      
S    | 4       | 750     | 3       | 0       | 0      
S    | 2       | 300     | 2       | 0       | 0     
S    | 3       | 10      | 1       | 0       | 0      

到目前为止,我已经尝试union allleft join没有任何欢乐。

1 个答案:

答案 0 :(得分:1)

您可以使用case表达式来区分交易类型:

SELECT   `product`, 
         SUM(CASE `type` WHEN 'S' THEN `final_price` END) AS `s_value`, 
         COUNT(CASE `type` WHEN 'S' THEN `final_price` END) AS `s_count`,
         SUM(CASE `type` WHEN 'R' THEN `final_price` END) AS `r_value`, 
         COUNT(CASE `type` WHEN 'R' THEN `final_price` END) AS `r_count`
GROUP BY `product`, `type`

编辑:
通过围绕列名称的前向引号,假设这是一个MySQL问题,即使它没有明确地标记为这样。 如果是这种情况,您可以利用MySQL自动从Boolean转换为int来简化count语句,将true作为1false作为0 SELECT `product`, SUM(CASE `type` WHEN 'S' THEN `final_price` END) AS `s_value`, SUM(`type` = 'S') AS `s_count`, SUM(CASE `type` WHEN 'R' THEN `final_price` END) AS `r_value`, SUM(`type` = 'R') AS `r_count` GROUP BY `product`, `type`

{{1}}