sql - 如何根据 CASE 表达式将列连接成一行?
问题描述
例如,我有下面的数据,我试图根据特定条件进行连接:
ID Amount Account Date
-----------------------------------------------
1 6000 G500 2-20-2020
1 6000 D800 2-20-2020
2 50 A950 8-20-2019
2 50 H650 8-20-2019
所以例如根据上面的数据,应用程序中ID为1的交易在同一个交易记录下,所以在这种情况下我使用下面的代码进行连接。
我能够使用它将它们连接成一行,现在结果显示在代码下方:
SELECT
STUFF((SELECT ', ' + Account FROM acct a
WHERE a.ID = b.ID AND a.Date = b.Date
FOR XML PATH('')), 1, 1, '') Account
FROM
acct b
输出:
ID Amount PaidIntoAccount Date
------------------------------------------------
1 6000 G500, D800 2-20-2020
这适用于上述场景,但对于 ID 2,我不想将它们连接起来,而是以某种方式在上述语句中包含一个条件,使其对于 ID 2 看起来像这样:
ID Amount Account Date
----------------------------------------------
2 50 A950 8-20-2019
2 50 H650 8-20-2019
目前使用上面的代码,它连接 ID 2 以及使它看起来像下面这样,这是错误的,我需要它看起来像上面:
ID Amount Account Date
----------------------------------------------------
2 50 H650, A950 8-20-2019
2 50 H650, A950 8-20-2019
这是因为在应用程序中,ID 1 的两个交易在同一个交易页面下,因此它们是一个交易,但只有两个不同的帐号,所以我将它们连接起来。而对于 ID 2,在应用程序中它们是 2 个单独的事务,但仍然具有相同的 ID 和日期,因此它们仍需要显示在它们的单独行上,而不是连接起来。我在上面提出的查询将连接两者。在这种情况下,我将如何包含不连接 ID 2 的逻辑并将它们保留为它们当前位于单独的行中?
解决方案
您将它们拆分为两个单独的结果集并放入UNION ALL
SELECT id,amount, date,
STUFF((SELECT ', ' + Account FROM acct a
WHERE a.ID = b.ID AND a.Date = b.Date
FOR XML PATH('')), 1, 1, '') as PaidIntoAccount
FROM
acct AS b
group by id,account, date
WHERE id = 1
UNION ALL
SELECt ID, Amount, Date, Account
From acct as b
WHERE id = 2