我有一张包含金额销售订单的表格以及每个金额可能包含多个元素的“类型”字段。
订单看起来像:
1000 | TypeA;TypeC
5000 | TypeA;TypeB
我希望按类型汇总订单,并在订单与其关联的多个类型时重复计算订单。同样,在上面的例子中,TypeA = 6000,TypeB = 5000,TypeC = 1000。
我正在努力解决这个问题。有什么建议吗?
答案 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;
两个注释:
order
和type
有一行。只是要强调,第二种方法比第二种方法更受欢迎。但是,如果你 使用一个列表 - 比如因为某人不了解并控制你的工作坚持 - 那么逗号胜过分号。
答案 1 :(得分:0)
一种方法是像这样计算总数(假设样本数据中的列名为col1
和col2
:
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
。