2014-10-17 187 views
1

是否可以使用多個CASE語句來並排返回(相同的行)結果?我已閱讀了許多與CASE相關的帖子,但沒有看到具體解決這個問題。使用多個CASE語句

我有2個樣本表: 交易

RowID TrxNo 
1  12345 
2  23456 
3  34567 
4  45678 
5  56789 
6  67890 
7  78901 

和文檔

RowID TrxNo DocNo 
1  12345  1 
2  12345  2 
3  12345  3 
4  23456  1 
5  34567  1 
6  34567  2 
7  45678  1 
8  45678  2 
9  56789  1 
10  56789  2 
11  56789  3 

基於這些表,這個查詢

SELECT T.TrxNo 
    ,CASE WHEN D.DocNo = 1 THEN D.DocNo ELSE 0 END AS Doc1 
    ,CASE WHEN D.DocNo = 2 THEN D.DocNo ELSE 0 END AS Doc2 
    ,CASE WHEN D.DocNo = 3 THEN D.DocNo ELSE 0 END AS Doc3 
FROM [dbo].[Transaction] T 
LEFT OUTER JOIN 
[dbo].[Document] D ON D.TrxNo = T.TrxNo 

返回

TrxNo Doc1 Doc2 Doc3 
    12345  1  0  0 
    12345  0  2  0 
    12345  0  0  3 
    23456  1  0  0 
    34567  1  0  0 
    34567  0  2  0 
    45678  1  0  0 
    45678  0  2  0 
    56789  1  0  0 
    56789  0  2  0 
    56789  0  0  3 
    67890  0  0  0 
    78901  0  0  0 

我想它返回

TrxNo Doc1 Doc2 Doc3 
12345  1  2  3 
23456  1  0  0 
34567  1  2  0 
45678  1  2  0 
56789  1  2  3 
67890  0  0  0 
78901  0  0  0 

這是我的第一篇 - 我希望的信息呈現不夠清楚。

回答

2

是,但你還需要聚集:

SELECT T.TrxNo, 
     MAX(CASE WHEN D.DocNo = 1 THEN D.DocNo ELSE 0 END) AS Doc1, 
     MAX(CASE WHEN D.DocNo = 2 THEN D.DocNo ELSE 0 END) AS Doc2, 
     MAX(CASE WHEN D.DocNo = 3 THEN D.DocNo ELSE 0 END) AS Doc3 
FROM [dbo].[Transaction] T LEFT OUTER JOIN 
    [dbo].[Document] D 
    ON D.TrxNo = T.TrxNo 
GROUP BY T.TrxNo; 
+0

我花了很多時間試圖「修復」這我想要的,沒有考慮到聚合解決的方式。非常感謝您的快速,現場響應。 – twinspar 2014-10-20 11:59:17