我有一个表,其中有带金额的销售订单,还有一个“类型”字段,每个金额可以有多个元素。
订单如下:

 1000  |  TypeA;TypeC
 5000  |  TypeA;TypeB

我想按类型汇总订单,如果订单有多个关联类型,则对其进行重复计数。同样,在上面的例子中,TypeA=6000,TypeB=5000,TypeC=1000。
我在为怎么做而挣扎。有什么建议吗?

最佳答案

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

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内置了处理逗号分隔列表的函数。
为了强调,第二个表比第二个方法更受欢迎。但是如果你必须使用一个列表——比如说因为一个不了解你的工作并控制你的工作的人坚持——那么逗号比分号更好。

关于mysql - 带重复计数的条件SQL和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43427476/

10-09 18:08