MySQL:将GROUP_CONCAT中的null替换为0

MySQL: Replace null with 0 in GROUP_CONCAT

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

I want the result:

Product with the number of trx that order by month asc

我有这样的查询:

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/f1ed4/3

这是我想到的。可能会更有效率,但您可以从中获得灵感。加入产品 table 而不是选择不同的产品。还扩大到包括超过 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

分组 table 具有可用值的内容。 对于产品 A:第 1 2 3 4 5 个月可用,并且 对于产品 B:第 1 2 5 个月可用

它不会自动填充 table 产品 B 的第 3 个月和第 4 个月

解决这个问题 要么你必须用 B - 3 和 B - 4 和 0 值填充此 table trx 数量 或者您可以创建临时 table 并在其中执行相同的操作。

要实现这一点, 1.你将不得不使用日期函数(将你的月份和年份值转换为日期) 2. 增加每个循环的月份值,如果月份值不能用于当前产品值,则在table中插入记录。 3. 然后 运行 你的分组查询这个更新后的 table 它会给你需要的结果。

这个任务执行起来有点复杂。您将不得不进行多次检查。

如果我能找到任何其他解决方案,我会 post。谢谢。

使用 cross join 生成您想要的所有行。那将是所有 product/month 组合。然后使用 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

注意 group_concat() 中的 order by。如果您希望结果按时间顺序排列,这一点非常重要。

select 产品,GROUP_CONCAT(number_of_trx) 按 trx_month 订购), group_concat(case when trx_year = 2018 then number_of_trx else 0 end)as data 来自 trx 按产品分组;

如果 concat 为空则 returns 0 否则 returns 值

SET SESSION group_concat_max_len = 10000000;
SELECT coalesce(group_concat(DISTINCT columnname),0) as values