4

これは何度も取り上げられていると思いますので、重複をお許しください。機能するクエリがありますが、現在、1 つの選択内に 6 つの CASE ステートメントがあります。誰かが、すべての WHEN 条件を 1 つの 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

CASEあなたの場合、結果はすべて選択の異なる列に入るため、それらをすべて one に入れることはできません。

ところで、ISNULL(region, '''') <> ''''条件と組み合わせると冗長になるため、条件を削除する必要がありLEN(region) > 5ます。(regionが null の場合、LEN(region)も null で、NULL > 5false です。)

于 2013-08-20T17:24:27.670 に答える
1

おっしゃる通りだと思いますが、6 つSUM()の 's' にはそれぞれ独自の意味があります。

すべての基準が同じCASEステートメント内にあると、詳細が失わSUM()れ、現在別々のステートメントを 1 つにまとめて返すことになります。

WHERE句で冗長な基準を組み合わせると、CASEステートメントをクリーンアップできますが、ここでは完全に冗長なものはありません。

于 2013-08-20T17:24:10.573 に答える