2014-10-17 214 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