mysql:将组\u concat中的null替换为0

0wi1tuuw  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(610)

我有一张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日
z8dt9xmd

z8dt9xmd1#

按可用值分组表内容。对于产品a:1 2 3 4 5个月可用,对于产品b:1 2 5个月可用
它不会根据产品b自动填写第3个月和第4个月的表格
要解决这个问题,您必须用b-3和b-4填充这个表,并用0表示trx的数量,或者您可以创建temp表并在该表中执行相同的操作。
为了实现这一点,1。您必须使用日期函数(将您的月份和年份值转换为日期)2。增加每个循环的月值,如果月值对当前产品值不可用,请在表中插入记录。三。然后在此更新的表上按查询运行您的组,它将为您提供所需的结果。
这是一项有点复杂的任务。你得做多次检查。
如果我能找到其他解决办法,我会发帖的。谢谢。

cbwuti44

cbwuti442#

生成要使用的所有行 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 bygroup_concat() . 如果你想让结果按时间顺序排列,这一点非常重要。

gblwokeq

gblwokeq3#

如果concat为null,则返回0,否则返回值
设置会话组\u concat \u max \u len=10000000;
选择coalesce(group\u concat(distinct columnname),0)作为值

ogsagwnx

ogsagwnx4#

从trx group by product中选择product、group concat(trx的编号)、order by trx month(trx的编号)、group concat(trx的年份=2018时,则trx的编号为0 end)作为数据;

6qftjkof

6qftjkof5#

这就是我想到的。可能效率会更高,但你可以从中获得灵感。连接到产品表,而不是选择不同的产品。也扩展到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

相关问题