我正在寻找一种从交易表中提取总计的方法。销售和退货交易按列进行区分,但值始终存储为正数。
我设法将按产品分组的不同交易类型总计拉为单独的行:
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 all
和left join
没有任何欢乐。
答案 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
作为1
和false
作为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}}