5

我有一个巨大的客户订单表,我想运行一个查询,按“user_id”按月列出过去 13 个月的订单。我现在所拥有的(如下)有效,但不是每个 user_id 只列出一行,而是为 user_id 拥有的每个订单列出一行。例如:一位用户在我们的生活中总共有 42 个订单,因此它在 42 行中列出了他的 user_id,并且每行只有一次付款。通常,我会将其放入 excel 中的数据透视表中,但我已超过百万行限制,因此我需要它正确且成功率为零。我希望读数看起来像这样:

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

123456 | 150.00 | 150.00 |

不是这个:

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

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;
4

1 回答 1

9

尝试类似:

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;
于 2013-08-07T19:11:27.553 回答