2011-01-08 25 views
0

次のCASE文を改善して差異を1回だけ計算しようとしています。私は負の数を避けるためにそれを行います:CASE WHEN SQL文の簡略化

SELECT (CASE WHEN ((SELECT 100 - (SELECT COUNT(CustomerId) FROM Customers)) > 0) 
     THEN  (SELECT 100 - (SELECT COUNT(CustomerId) FROM Customers)) 
     ELSE  (0) 
     END) 

これは愚かに見えるだけでなく、スレッドセーフでもありません。私は以下を試しましたが、エラーメッセージ "無効な列名 'diff'が表示されます。"

SELECT (CASE WHEN ((SELECT 100 - (SELECT COUNT(CustomerId) FROM Customers) as diff) > 0) 
     THEN (diff) 
     ELSE (0) 
     END) 

これをどのように簡略化できますか?すでにこのジョブを実行する組み込みSQL関数はありますか?

編集:申し訳ありませんが、selectステートメントはビュー宣言の中にあるので、変数を宣言できません。

私はあなたのロジックを右に従っている場合

答えて

2

、これはそれを行う必要があります。

SELECT COALESCE ((SELECT 100 - COUNT(CustomerID) 
FROM Customers 
HAVING COUNT(CustomerID) < 100), 0) 

少しより優雅。

行ベースのMAX()関数がある場合は、それも使用できます。もちろん、簡単に書き込むことができます。

+0

ありがとう、それはありました!私はそれをさらに改善しました。SELECT COALESCE((SELECT 100 - COUNT(CustomerID)をdiff FROM diff <100)、0) ' – kateroh

2
DECLARE @diff int 
SELECT @diff = 100 - COUNT(*) FROM Customers 

SELECT CASE WHEN @diff > 0 THEN diff   
      ELSE 0   
     END as Diff 
+0

ただ、3番目のステートメントでSELECTの代わりにSETを使用して、2度目にテーブルにヒットしていないことを明確にするためです。 (今日取引をしていた...) –

+0

@Philip Kelley:文脈がなければ、最後の選択が結果を呼び出し元に返すかどうかは分かりません。 –

1

変数を使用してクエリの結果を開始することができますので、2回実行する必要はありません。たとえば:

DECLARE @CustomerCount INT 
SELECT @CustomerCount = COUNT(CustomerId) FROM Customers 
SELECT CASE WHEN (100 - @CustomerCount > 0) 
    THEN 100 - @CustomerCount 
    ELSE (0) 
    END 
1

あなたは正しいです、あなたは一度だけカウントすると、それは明らかにあなたのロジックが何であるかを示しているので、あなたはそれをやってみたいです。

SELECT CASE WHEN cnt > 100 THEN 0 
     ELSE 100 - cnt END AS diff 
FROM (SELECT COUNT(1) AS cnt 
     FROM Customers) AS CustomerCnt