首页 > 解决方案 > 如何根据 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 的逻辑并将它们保留为它们当前位于单独的行中?

标签: sqlsql-serverconcatenation

解决方案


您将它们拆分为两个单独的结果集并放入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

推荐阅读