使用多个CASE语句

时间:2014-10-17 15:33:46

标签: sql 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

这是我的第一篇文章 - 我希望这些信息足够清晰。

1 个答案:

答案 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;