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

9
我有一个巨大的客户订单表,我想运行一个查询,按月份列出过去13个月的“user_id”订单。目前我的查询(如下所示)可以工作,但是它列出的每个用户ID都显示了该用户的每个订单。例如:一个用户在我们这里的总共有42个订单,因此它会在42行中列出他的用户ID,而每行只有一个付款。通常我会把这个放到Excel的透视表中,但是我超过了一百万行的限制,所以我需要正确的方法并且一直没有成功。我希望输出结果看起来像这样:
用户ID | 2012年7月 | 2012年8月 |
123456 | 150.00 | 150.00 |
而不是这样:
用户ID | 2012年7月 | 2012年8月 |
123456 | 0.00 | 150.00 |
123456 | 150.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;
1个回答

18

尝试类似以下代码:

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;

如果我想跨越几年怎么办?比如说,如果不是07月和08月,而是2012年12月和2013年01月。我的目标是长时间运行以查看订单趋势。谢谢! - greenpowerade
你仍然可以使用你之前用的 CASE - 我把年份过滤器移到了 WHERE 条件中,以缩短查询时间并提高速度。 - Ihor Romanchenko
那是我的错误。谢谢!有没有其他的方法来处理多列数据?或者如果我想提取24个月的数据,那么我是不是需要有24行数据,每行代表一个月? - greenpowerade
@ greenpowerade 您可以尝试这个。但最好的解决方案是在客户端使用某种编程语言将数据获取到一个简单的id,月份,总和表中,并进行透视。 - Ihor Romanchenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接