MySQL:在GROUP_CONCAT中将null替换为0

时间:2018-07-20 04:22:45

标签: mysql sql database group-concat sqlfiddle

我有一个名为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

5 个答案:

答案 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)作为值