Sql 单个CASE语句中的多个列

Sql 单个CASE语句中的多个列,sql,tsql,Sql,Tsql,我相信这已经涵盖了很多次,所以请原谅我的重复。我有一个可以运行的查询,但当前在一个select中有6个CASE语句。有人提到,最好将我所有的WHEN条件放在一个案例中进行优化。然而,我无法做到这一点 select right(RTRIM(region),5) as cell_id, sum(CASE WHEN LEFT(cparty,3) in ('999','998','997') THEN chargeduration/60 else 0 END) AS OnNet_Minute

我相信这已经涵盖了很多次,所以请原谅我的重复。我有一个可以运行的查询,但当前在一个select中有6个CASE语句。有人提到,最好将我所有的WHEN条件放在一个案例中进行优化。然而,我无法做到这一点

select right(RTRIM(region),5) as cell_id, 
     sum(CASE WHEN LEFT(cparty,3) in ('999','998','997') THEN chargeduration/60 else 0 END) AS OnNet_Minutes,
     sum(CASE WHEN LEFT(cparty,3) in ('996','995') THEN chargeduration/60 else 0 END) AS OffNet_C_Minutes,
     sum(CASE WHEN LEFT(cparty,3) in ('994','993','992') THEN chargeduration/60 else 0 END) AS OffNet_A_Minutes,
     sum(CASE WHEN LEFT(cparty,3) in ('991','990') THEN chargeduration/60 else 0 END) AS OffNet_S_Minutes,
     sum(CASE WHEN LEFT(cparty,2) = '00' THEN chargeduration/60 else 0 END) AS OffNet_T_Minutes,
     sum(CASE WHEN len(cparty) < 6 and LEFT(cparty,1) <> 0 THEN chargeduration/60 else 0 END) AS SC_Minutes            
  from August.dbo.cdr20130818 
  where CHARGEDURATION > 0 and ISNULL(region,'''')<>'''' and LEN(region) > 5
group by right(RTRIM(region),5)
order by right(RTRIM(region),5) asc
选择右侧(RTRIM(区域),5)作为单元id,
将('999'、'998'、'997')中的(第三方)和('999'、'998'、'997')中的(第三方)计算为OnNet_分钟,然后计算持续时间/60,否则为0结束,
将('996'、'995')中的(第三方)和('996'、'995')中的(第三方)之和(其他情况下为0结束)作为OffNet____分钟,
将('994'、'993'、'992')中的(第三方)和('994'、'993'、'992')中的(第三方)计算为净外分钟的总和,然后按持续时间/60或0结束计算,
将('991','990')中的(第三方)和('991','990')中的(第三方)之和(其他情况下为0结束)作为净外分钟计算,
作为净外时间分钟的总和(左边的情况下(第2方)=“00”,然后计费持续时间/60,否则为0结束),
总和(当len(cparty)<6且LEFT(cparty,1)为0时,则chargeduration/60否则为0结束)作为SCU分钟
从8月1日起,dbo.cdr20130818
其中CHARGEDURATION>0且为空(区域“,”和LEN(区域)>5
右侧分组(RTRIM(区域),5)
右侧订单(RTRIM(区域),5)asc

我想你说得对,六种不同的
SUM()
,每一种都有自己的意义

如果所有条件都在同一个
案例中
语句中,您将丢失详细信息,您将返回当前单独语句的
SUM()


WHERE
子句中组合冗余条件可以清理
CASE
语句,但此处没有任何完全冗余的内容。

在您的情况下,不能将它们全部放在一个
CASE
中,因为结果都放在select语句的不同列中


顺便说一句,您应该删除
ISNULL(region,''''''''''
条件,因为它与
LEN(region)>5
条件配对时是多余的。(当
region
为空时,
LEN(region)
也为空,
null>5
为假。)

您希望在输出中为充电持续时间设置一个单独的汇总列,还是六个?您应该问此人这是什么意思。您的查询看起来很好。单个
CASE
表达式意味着您将得到一列,可以吗?逻辑是6列返回6个不同的数据细分。如果需要6列返回6个不同的值,然后你做得很好,把条件改成你说的不是一回事。那么真正等于“”且不为null的区域呢?@FabienTheSolution一般来说,我同意你的观点,但请注意后面的
LEN(region)>5
条件?这会过滤掉你提到的情况。因此可能是
和LEN(ISNULL(region,'')>5
,而不是
和ISNULL(region,'')”和LEN(region)>5
:)实际上,在这一点上,你也可以使用
LEN(region)>5
,并依赖于这样一个事实,当
region
为null时,
LEN(region)
也为空,
null>5
为假。(我大体上同意你的观点。)