2011-09-14 15 views
1

私は3つのテーブルを持っています。彼らは1対多数の関係を持っていますSQL条件付き計算

table1 - mainID, Select00(bit), Select01(bit) 
table2 - secID, mainID 
table3 - secID, Num00, Num01 



SELECT table1.mainID , SUM(table3.Num00) as S00, SUM(table3.Num01) as S01 
FROM table1 INNER JOIN 
     table2 ON table1.mainID = table2.mainID INNER JOIN 
     table3 ON table2.secID = table3.secID 
GROUP BY table1.mainID HAVING table1.mainID =11 

次のクエリは機能しますが、私にはすべての合計が与えられます。

条件に基づいてSUMを取得するにはどうすればよいですか?すなわち

S00 = SUM(table3.Num00) if table1.Select00 = 1 (true) 
S01 = SUM(table3.Num01) if table1.Select01 = 1 (true) 

答えて

5
SELECT 
    t1.mainID, 
    S00 = SUM(CASE WHEN t1.Select00 = 1 THEN t3.Num00 ELSE 0 END), 
    S01 = SUM(CASE WHEN t1.Select01 = 1 THEN t3.Num01 ELSE 0 END) 
FROM 
    dbo.table1 AS t1 
    INNER JOIN dbo.table2 AS t2 
    ON t1.mainID = t2.mainID 
    INNER JOIN dbo.table3 AS t3 
    ON t2.secID = t3.secID 
WHERE t1.MainID = 11 
GROUP BY table1.mainID; 
+0

WHEREとHAVINGを使用することにはどんな利点がありますか? – user450143

+0

ちょうど習慣。 HAVINGは通常集約をフィルタリングするために使用されます(論理的にGROUP BYの後ろにある理由です)。例えば、HAVING SUM(...)> 10.グループ化の前にフィルタリングする場所 - それはどちらかというと効率的ですHAVINGを使用するのと同じくらい効果的です(しかし、私の長年の仮定が間違っていることが証明されてうれしいですが)。 –