我正在尝试在SQL Server中创建一个表,它将客户聚合活动组合到一行中。
例如,客户A有2个会员订单和3个活动订单。现在我的查询导致了2行。一个显示客户A有2个会员订单和0个事件订单,另一个显示0个会员订单和3个事件订单。
如何创建一个只创建一行的查询?我认为问题是我必须在subsystem
声明中加入fulfill_status_code
和group by
。
这是我正在使用的代码:
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 :(得分: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
还有很多其他方法可以做到这一点。
答案 1 :(得分:0)
你几乎总是不想在案例陈述中得到总和或计数,而是将案例陈述放在总和中。
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