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