在SQL中使用CASE语句时,如何删除额外的“分组依据”列?

时间:2016-11-14 18:42:22

标签: sql sql-server

我正在尝试在SQL Server中创建一个表,它将客户聚合活动组合到一行中。

例如,客户A有2个会员订单和3个活动订单。现在我的查询导致了2行。一个显示客户A有2个会员订单和0个事件订单,另一个显示0个会员订单和3个事件订单。

如何创建一个只创建一行的查询?我认为问题是我必须在subsystem声明中加入fulfill_status_codegroup 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

2 个答案:

答案 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