4

我相信这已经被覆盖了很多次,所以请原谅我的重复。我有一个有效的查询,但目前在一个选择中有 6 个 CASE 语句。有人提到,最好将我所有的 WHEN 条件放在一个 CASE 中进行优化。但是,我无法做到这一点

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
4

2 回答 2

4

在您的情况下,您不能将它们全部放入 one CASE,因为结果都进入选择的不同列。

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

于 2013-08-20T17:24:27.670 回答
1

我认为你说得对,六个不同SUM()的,每个都有自己的意义。

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

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

于 2013-08-20T17:24:10.573 回答