我有一张table叫 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
我想要结果:
按月asc订购的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
但是,我想要这样的结果:(月的空值被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月1日至4月3日
5条答案
按热度按时间z8dt9xmd1#
按可用值分组表内容。对于产品a:1 2 3 4 5个月可用,对于产品b:1 2 5个月可用
它不会根据产品b自动填写第3个月和第4个月的表格
要解决这个问题,您必须用b-3和b-4填充这个表,并用0表示trx的数量,或者您可以创建temp表并在该表中执行相同的操作。
为了实现这一点,1。您必须使用日期函数(将您的月份和年份值转换为日期)2。增加每个循环的月值,如果月值对当前产品值不可用,请在表中插入记录。三。然后在此更新的表上按查询运行您的组,它将为您提供所需的结果。
这是一项有点复杂的任务。你得做多次检查。
如果我能找到其他解决办法,我会发帖的。谢谢。
cbwuti442#
生成要使用的所有行
cross join
. 这将是所有产品/月组合。然后使用left join
引入数据和group by
浓缩:注意
order by
在group_concat()
. 如果你想让结果按时间顺序排列,这一点非常重要。gblwokeq3#
如果concat为null,则返回0,否则返回值
设置会话组\u concat \u max \u len=10000000;
选择coalesce(group\u concat(distinct columnname),0)作为值
ogsagwnx4#
从trx group by product中选择product、group concat(trx的编号)、order by trx month(trx的编号)、group concat(trx的年份=2018时,则trx的编号为0 end)作为数据;
6qftjkof5#
这就是我想到的。可能效率会更高,但你可以从中获得灵感。连接到产品表,而不是选择不同的产品。也扩展到5个月以后的月份。