2016-08-23 69 views
0
SELECT COUNT(ID) IDCount 
, SUM(ValueA) SumA 
, SUM(ValueB) SumB 
, FlagA 
, FlagB 
, GroupColumn 
FROM 
( SELECT w.ID 
    , x.ValueA 
    , x.ValueB 
    , y.FlagA 
    , y.FlagB 
    , w.GroupColumn 

    FROM tableW w 
    LEFT JOIN tableX x ON w.ID = x.ID 
    LEFT JOIN tableY y ON w.ID = y.ID 

    WHERE w.SomeColumn = SomeValue 
) res 

GROUP BY res.GroupColumn, res.FlagA, res.FlagB 

ORDER BY res.GroupColumn, res.FlagA DESC, res.FlagB DESC 

FLAGA和FLAGB爲標誌,所以他們只遇上1或0。我需要這個返回4行,每GroupColumn分組,一爲標誌的每個組合。SQL-服務器恰好返回每組4個結果

現在發生的事情是,有時候沒有什麼東西會從內部選擇回來,所以它不會返回任何東西。在那種情況下,我只能爲該組取回3行。我需要的是第四行返回IDCount,SumA和SumB的0值。

希望這是明確的。提前感謝您的幫助!

回答

1

你需要使你的子查詢成爲你的外部表,並且你的標誌/組合你的內部表,並且加入這兩個。

所以首先獲得所有4個組合爲每個組列:

SELECT w.GroupColum, f.A, f.B 
FROM (SELECT DISTINCT GroupColumn FROM TableW) AS W 
     CROSS JOIN (VALUES (0, 0), (0, 1), (1, 0), (1, 1)) AS f (A, B) 

這給你所有你需要的組合,無論在你的數據是否存在組合。然後你可以加入你的數據回來:

SELECT IDCount = COUNT(res.ID), 
     SumA = SUM(res.ValueA), 
     SumB = SUM(res.ValueB), 
     FlagA = f.A, 
     FlagB = f.B, 
     w.GroupColumn 
FROM (SELECT DISTINCT GroupColumn FROM TableW) AS w 
     CROSS JOIN (VALUES (0, 0), (0, 1), (1, 0), (1, 1)) AS f (A, B) 
     LEFT JOIN 
     ( SELECT w.ID, x.ValueA, x.ValueB, y.FlagA, y.FlagB, w.GroupColumn 
      FROM tableW w 
      LEFT JOIN tableX x ON w.ID = x.ID 
      LEFT JOIN tableY y ON w.ID = y.ID 
      WHERE w.SomeColumn = SomeValue 
     ) res 
      ON res.GroupColumn = w.GroupColumn 
      AND res.FlagA = f.A 
      AND res.FlagB = f.B 
GROUP BY f.A, f.B, w.GroupColumn; 
+0

感謝您的回覆!不幸的是,我得到了和以前一樣的結果。我改變了ON到: )RES ON res.GroupColumn = W.GroupColumn 和FA = res.FlagA 和FB = res.FlagB 我能得到4個結果的唯一方法是完全刪除這兩條線: AND fA = res.FlagA AND fB = res.FlagB 但是,這隻給了我四次相同的結果。 –

+0

我有一些列/連接搞砸了。它現在對你有用嗎? – GarethD

+0

將外部select語句中的res.GroupColumn更改爲w.GroupColumn爲我解決了這個問題。非常感謝你爲這個聰明的解決方案! –