Sum(Case when) 导致选择的多行

2024-03-17

我有一张巨大的客户订单表,我想运行一个查询来按“user_id”按月列出过去 13 个月的订单。我现在所拥有的(如下)可以工作,但不是只为每个 user_id 列出一行,而是为 user_id 的每个订单列出一行。例如:一个用户一生中总共有 42 个订单,因此它在 42 行中列出了他的 user_id,并且每行只有一笔付款。通常我会把它扔到 Excel 的数据透视表中,但我已经超过了百万行限制,所以我需要它是正确的并且成功率为零。我希望读出的内容如下所示:

用户 ID |七月 12 | 8 月 12 日 |

123456 | 150.00 | 150.00 150.00 | 150.00

不是这个:

用户 ID |七月 12 | 8 月 12 日 |

123456 | 0.00 | 0.00 150.00 | 150.00

123456 | 150.00 | 150.00 0.00 | 0.00

等等 40 多行

SELECT ui.user_id, 
SUM(CASE WHEN date_part('year', o.time_stamp) = 2012 AND date_part('month', o.time_stamp) = 07 THEN o.amount ELSE 0 END) jul_12,
SUM(CASE WHEN date_part('year', o.time_stamp) = 2012 AND date_part('month', o.time_stamp) = 08 THEN o.amount ELSE 0 END) aug_12,
FROM orders o JOIN users_info ui ON ui.user_id = o.user_id
WHERE user_id = '123456'
GROUP BY ui.user_id, o.time_stamp;

尝试类似的方法:

SELECT ui.user_id, 
SUM(CASE WHEN date_part('year', o.time_stamp) = 2012 AND date_part('month', o.time_stamp) = 07 THEN o.amount ELSE 0 END) jul_12,
SUM(CASE WHEN date_part('year', o.time_stamp) = 2012 AND date_part('month', o.time_stamp) = 08 THEN o.amount ELSE 0 END) aug_12,
FROM orders o JOIN users_info ui ON ui.user_id = o.user_id
WHERE user_id = '123456'
GROUP BY ui.user_id;

您每个订单都会获得一行,因为您按以下条件进行分组o.time_stamp每个订单的时间戳都不同。

查询的较短版本:

SELECT ui.user_id, 
SUM(CASE WHEN date_trunc('month', o.time_stamp) = to_date('2012 07','YYYY MM') THEN o.amount END) jul_12,
SUM(CASE WHEN date_trunc('month', o.time_stamp) = to_date('2012 08','YYYY MM') THEN o.amount END) aug_12,
FROM orders o 
JOIN users_info ui ON ui.user_id = o.user_id
WHERE ui.user_id = '123456'
GROUP BY ui.user_id;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sum(Case when) 导致选择的多行 的相关文章

随机推荐