2016-11-14 74 views
1

我正在嘗試在SQL Server中創建一個將客戶聚合活動合併到單個行中的表。在SQL中使用CASE語句時,如何擺脫額外的「group by」列?

例如,客戶A有2個會員訂單和3個事件訂單。現在我的查詢產生了2行。一個向客戶A顯示2個會員訂單和0個事件訂單,另一個顯示0個會員訂單和3個事件訂單。

如何創建一個只會創建一個看起來像這樣的行的查詢?我認爲問題在於我必須在group by聲明中包含subsystemfulfill_status_code

下面是我使用的代碼:

select ship_master_customer_id, 
CASE WHEN subsystem = 'MBR' AND fulfill_status_code != 'c' THEN count(order_no) ELSE null END as membership_orders, 
CASE WHEN subsystem = 'MBR' AND fulfill_status_code != 'c' THEN sum(actual_total_amount) ELSE null END as membership_amount, 
CASE WHEN subsystem = 'MTG' AND fulfill_status_code != 'c'THEN sum(actual_total_amount) ELSE null END as event_orders, 
CASE WHEN subsystem = 'MTG' AND fulfill_status_code != 'c'THEN count(order_no) ELSE null END as event_amount 
from order_detail od (nolock) 
where invoice_date>'5/1/2015' 

group by ship_master_customer_id, subsystem, fulfill_status_code 
+0

'我如何創建一個查詢來創建一個看起來像?我認爲問題在於我必須在子句中包含子系統和fulfill_status_code。「那麼,您的問題到底是什麼? – Angelo

+0

你能解決你的問題嗎? –

回答

3

試試這個:

select ship_master_customer_id, 
-- This is a "fake count": the value is 1 when your condition is true, and we 
-- add up all the 1's. 
SUM(CASE WHEN subsystem = 'MBR' AND fulfill_status_code != 'c' THEN 1 ELSE 0 END) as membership_orders, 
SUM(CASE WHEN subsystem = 'MBR' AND fulfill_status_code != 'c' THEN 1 ELSE 0 END) as membership_amount, 
SUM(CASE WHEN subsystem = 'MTG' AND fulfill_status_code != 'c' THEN 1 ELSE 0 END) as event_orders, 
SUM(CASE WHEN subsystem = 'MTG' AND fulfill_status_code != 'c' THEN 1 ELSE 0 END) as event_amount 

from order_detail od (nolock) 
where invoice_date>'5/1/2015' 

group by ship_master_customer_id 

有很多其他的方法來做到這一點,以及。

+0

哦,你在我編輯的時候發貼 – Hogan

+0

@Hogan很明顯,他們的想法很像! :) –

+1

這是經驗上的真實。 – Hogan

0

你幾乎總是不想在case語句中計算總和或計數,而是把case語句放在總和中。

select ship_master_customer_id, 
SUM(CASE WHEN subsystem = 'MBR' AND fulfill_status_code != 'c' AND order_no is not null THEN 1 ELSE 0 END) AS membership_orders, 
SUM(CASE WHEN subsystem = 'MBR' AND fulfill_status_code != 'c' THEN actual_total_amount ELSE 0 END) AS membership_amount, 
SUM(CASE WHEN subsystem = 'MTG' AND fulfill_status_code != 'c' THEN actual_total_amount ELSE 0 END) AS event_orders, 
SUM(CASE WHEN subsystem = 'MTG' AND fulfill_status_code != 'c' AND order_no is not null THEN 1 ELSE 0 END) AS event_amount 
from order_detail od (nolock) 
where invoice_date > '5/1/2015' 
group by ship_master_customer_id