2013-08-07 45 views
0

我有一個巨大的客戶訂單表,我想運行一個查詢來按'user_id'在過去13個月中按月列出訂單。我現在擁有的(下面)工作,但不是每user_id只列出一行,它爲user_id每個訂單列出一行。例如:一位用戶在我們的生活中總共有42份訂單,所以它列出了42行中的user_id,並且每行只有一筆付款。通常我會把它放在Excel的數據透視表中,但是我超過了100萬行的限制,所以我需要它是正確的,並且沒有成功。我想讀出來看起來像這樣:Sum(Case when)導致選擇的多行

user_id | jul_12 | aug_12 |

123456 | 150.00 | 150.00 |

不是這樣的:

user_id | jul_12 | aug_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; 

回答

1

試着這麼做:

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; 
+0

如果我想多年的跨越?所以,如果這兩個而不是7月7日和8月8日,2012年12月12日和2013年1月1日。我的目標是長時間運行它以查看訂單趨勢。謝謝! – greenpowerade

+0

您仍然可以使用您正在使用的'CASE' - 將年份過濾器移至WHERE以縮短查詢並加快速度。 –

+0

Duh - 我猜這對我來說很糟糕。謝謝!是否有不同的方法來處理多列?或者如果我想抽24個月,我會有24條線,每個月有一條線? – greenpowerade