2011-01-14 19 views
3

私は、この形式のテーブル条件付き合計T-SQL

COL1 COL2 COL3 
A NULL 4 
A NULL 4 
A VAL1 4 
A VAL2 4 
A VAL3 4 
B NULL 5 
B VAL1 6 

を持って、私は次のように出力を引き出すために必要があります。

COL1 TOTAL VALID 
A 20  12 
B 11  6 

私の質問は、私は「VALIDを得るのですか、です'column - col2がnullでない場合のみ、col3の合計を計算する必要があります。

SUMとGROUP BY句を使用して 'TOTAL'フィールドを正しく取得できました。しかし、どのように私は '有効'列を計算するのですか?

アイデア? ありがとう!

答えて

14

は何か:

SELECT col1 
    , SUM(col3) AS TOTAL 
    , SUM(CASE WHEN col2 IS NOT NULL THEN col3 ELSE NULL END) AS VALID 
    FROM mytable 
GROUP BY col1 

"トリック" はCASEを使用することですcol3の値を条件付きで返します。

+0

指定した結果セットを返す方法は複数あります。このアプローチの大きな利点の1つはパフォーマンスです。これはデータを1回だけ通過する。これにより、相関サブクエリ(外部クエリによって返されるすべての行に対して実行される)のオーバーヘッドが回避されます(SLaksの回答を参照)。また、導出されたテーブルのオーバーヘッド(すなわち、インラインビューの実現)と結合操作(クリス・シャインの回答のように、btwは正しい結果を保証しません)を避けています。 – spencer7593

+0

これは本当にエレガントで、必要です –

0

あなたは、サブクエリを使用することができます。

SELECT SUM(Col3) AS Total, 
     (SELECT SUM(Filtered.Col3) 
     FROM table Filtered 
     WHERE Filtered.Col1 = Grouped.Col1 
      AND Filtered.Col2 IS NOT NULL 
     ) AS Valid 
FROM table Grouped 
GROUP BY Col1 
-1

これは動作するはずです...このような

SELECT B.COL1, SUM(A.COL3) AS TOTAL, SUM(B.COL3) AS VALID 
FROM 
(SELECT COL1, COL3 FROM ORIGINAL WHERE COL2 IS NULL) A 
INNER JOIN (SELECT COL1, COL3 FROM ORIGINAL) B ON A.COL1 = B.COL1