具有重复计数的条件SQL Sum

时间:2017-04-15 14:51:55

标签: mysql sql

我有一张包含金额销售订单的表格以及每个金额可能包含多个元素的“类型”字段。

订单看起来像:

 1000  |  TypeA;TypeC
 5000  |  TypeA;TypeB

我希望按类型汇总订单,并在订单与其关联的多个类型时重复计算订单。同样,在上面的例子中,TypeA = 6000,TypeB = 5000,TypeC = 1000。

我正在努力解决这个问题。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果你有一个单独的类型表,我建议:

select t.type, sum(o.amount)
from types t left join
     orders o
     on find_in_set(t.type, replace(o.types, ';', ','))
group by t.type;

如果没有单独的表,您可以将值放入列中:

select sum(case when find_in_set('TypeA', replace(o.types, ';', ',')) > 0 then amount else 0 end) as amount_A,
       sum(case when find_in_set('TypeB', replace(o.types, ';', ',')) > 0 then amount else 0 end) as amount_B,
       sum(case when find_in_set('TypeC', replace(o.types, ';', ',')) > 0 then amount else 0 end) as amount_C   
from orders o;

两个注释:

  • 在字符串列中存储多个值不是存储值的SQLish方式。您应该每ordertype有一行。
  • 如果必须,那么至少使用一个逗号,因为MySQL内置了用于处理逗号分隔列表的函数。

只是要强调,第二种方法比第二种方法更受欢迎。但是,如果你 使用一个列表 - 比如因为某人不了解并控制你的工作坚持 -​​ 那么逗号胜过分号。

答案 1 :(得分:0)

一种方法是像这样计算总数(假设样本数据中的列名为col1col2

SELECT SUM(IF(CONCAT(';',t.col2,';') LIKE '%;TypeA;%',t.col1,NULL)) AS TypeA
     , SUM(IF(CONCAT(';',t.col2,';') LIKE '%;TypeB;%',t.col1,NULL)) AS TypeB
     , SUM(IF(CONCAT(';',t.col2,';') LIKE '%;TypeC;%',t.col1,NULL)) AS TypeC
  FROM mytable t
 WHERE ...

此方法允许col1的值有条件地包含在多个结果中,一次通过mytable