我有一个名为trx
的表
trx_year trx_month Product number_of_trx
2018 4 A 100
2018 5 A 300
2018 3 A 500
2018 1 A 200
2018 2 A 150
2018 5 B 400
2018 2 B 200
2018 1 B 350
我想要结果:
具有按月升序排序的trx数量的产品
我有这样的查询:
select product,GROUP_CONCAT(number_of_trx order by trx_month)
from trx
where trx_year=2018
group by product
该查询的结果:
Product Data
A 200,150,500,100,300
B 350,200,400
但是,我想要这样的Result :(将月份的空值替换为0)
Product Data
A 200,150,500,100,300
B 350,200,0,0,400
我已经像这样尝试过ifnull()
和coalesce()
:(但结果与以前相同)
select product,GROUP_CONCAT(ifnull(number_of_trx,0) order by trx_month)
from trx
where trx_year=2018
group by product;
select product,GROUP_CONCAT(coalesce(number_of_trx,0) order by trx_month)
from trx
where trx_year=2018
group by product;
也许您可以帮我,请检查http://sqlfiddle.com/#!9/f1ed4/3
答案 0 :(得分:0)
这是我想出的。可能会更有效率,但是您可以从中获得想法。加入产品表,而不是选择不同的产品。还可以扩展到5个月后的月份。
SELECT trx2.product, GROUP_CONCAT(trx2.total order by trx2.trx_month)
FROM
(SELECT temp2.product, temp2.trx_month, SUM(temp2.number_of_trx) AS total
FROM
(SELECT products.product, temp1.trx_month, temp1.number_of_trx
FROM (select 1 as trx_month, 0 as number_of_trx
UNION select 2, 0
UNION select 3, 0
UNION select 4, 0
UNION select 5, 0) as temp1,
(SELECT distinct product from trx) AS products
UNION ALL
SELECT trx.product, trx.trx_month, trx.number_of_trx
FROM trx) as temp2
GROUP BY temp2.product, temp2.trx_month) AS trx2
GROUP BY product
答案 1 :(得分:0)
使用可用值对表内容进行分组。 产品A:有1 2 3 4 5个月的可用时间, 对于产品B:有1 2 5个月可用
它不会在第3和第4个月针对产品B自动填充表格
要解决此问题 要么您必须用B-3和B-4以及0值填写此表的trx数量 或者,您可以创建临时表,并在其中进行相同的操作。
要实现此目的, 1.您将必须使用日期功能(将您的月份和年份值转换为日期) 2.增加每个循环的月份值,如果没有月份值可用于当前产品值,则在表中插入记录。 3.然后在此更新的表上通过查询运行您的组,它将为您提供所需的结果。
这是执行起来有点复杂的任务。您将必须进行多次检查。
如果我能找到其他解决方案,我会发布。谢谢。
答案 2 :(得分:0)
使用cross join
生成所需的所有行。那将是所有产品/月组合。然后使用left join
引入数据,并使用group by
压缩数据:
select p.product,
group_concat(coalesce(trx.number_of_trx, 0) order by trx_month)
from (select distinct product from trx) p cross join
(select distinct trx_year, trx_month
from trx
where trx_year = 2018
) yyyymm left join
trx
on trx.product = p.product and
trx.trx_year = yyyymm.trx_year
trx.trx_month = yyyymm.trx_month
group by p.product
请注意order by
中的group_concat()
。如果您希望按时间顺序显示结果,这非常重要。
答案 3 :(得分:0)
选择产品,GROUP_CONCAT(trx_month的订单数量) group_concat(当trx_year = 2018时number_of_trx否则0结束的情况)作为数据 来自trx 按产品分组;
答案 4 :(得分:0)
如果concat为null,则返回0,否则返回值
SET SESSION group_concat_max_len = 10000000;
SELECT合并(group_concat(DISTINCT列名),0)作为值