SQL Server:按字符串连接分组

Posted

技术标签:

【中文标题】SQL Server:按字符串连接分组【英文标题】:SQL Server : Group by string concatenation 【发布时间】:2012-10-21 12:40:47 【问题描述】:

我有一个问题。我知道以前有人问过。我查看了相关问题,但无法让我的 SQL 脚本工作。

这是我的查询:

SELECT T1.PART_ID, T2.ID, T2.DESCRIPTION
FROM #TEMP T1 
INNER JOIN #TEMP2 T2 ON T1.PART_ID = T2.PART_ID
ORDER BY T2.ID

表:

PART_ID |  ID        |    DESCRIPTION
----------------------------------
10002   |  1182505   |   Tagfahrlichtschaltung
80029   | 1182505    |   Bluetooth
20004   | 1212866    |    Kindersitzbefestigung
10045   |  1212866   |    Lederlenkradrriegelung
11908   |  1257946   |    Airbag
22346   | 1257946    |    Automatic

我想要这样的结果:

ID       | LISTOFPARTS
-----------------------------
1182505  |  "10002 : Tagfahrlichtschaltung ; 80029 : Bluetooth  "
1212866  |  "20004 : Kindersitzbefestigung ; 10045 : Lederlenkradrriegelung"
1257946  |  "11908 : AIRBAG ; 22346 : AUTOMATIC"

我猜它必须与 XML PATH 相关,但我无法让它工作。 任何人都可以重写查询,以便它返回分组并以字符串连接的结果吗?

将不胜感激有或没有 XML PATH 的解决方案。

谢谢!

【问题讨论】:

建议:在sqlfiddle.com 中发布您的架构,以方便我们使用。 *编辑 - 这可能与您的问题有关:***.com/questions/10405362/… 第一个你不是加入了错误的领域吗? ID 似乎与 part_ID 不同。 没有。 Id 是车辆 ID。 PartID 是零件的 ID。 PartID 在 CARS 和 CAR_PARTS 表中很常见。描述取自 CAR_PARTS 表并连接以查找汽车的部件(描述)。 【参考方案1】:

http://sqlfiddle.com/#!3/d41d8/5441

create table #Temp (PART_ID bigint, ID bigint, DESCRIPTION nvarchar(max))

insert into #Temp
select 10002, 1182505, 'Tagfahrlichtschaltung' union all
select 80029, 1182505, 'Bluetooth' union all
select 20004, 1212866, 'Kindersitzbefestigung' union all
select 10045, 1212866, 'Lederlenkradrriegelung' union all
select 11908, 1257946, 'Airbag' union all
select 22346, 1257946, 'Automatic'

select 
    T1.ID,
    stuff(
        (
            select ' ; ' + cast(T2.PART_ID as nvarchar(max)) + ' : ' + T2.DESCRIPTION
            from #TEmp as T2
            where T2.ID = T1.ID 
            for xml path(''), type
        ).value('data(.)', 'nvarchar(max)')
    , 1, 3, '') as LISTOFPARTS
from #TEMP as T1 
group by T1.ID
order by T1.ID

【讨论】:

【参考方案2】:

这会起作用 -

DECLARE @TABLE TABLE (PART_ID INT,ID INT, DESCRIPTION VARCHAR(100))

INSERT INTO @TABLE 
VALUES
(10002   ,1182505   ,   'Tagfahrlichtschaltung')
,(80029   , 1182505    ,   'Bluetooth')
,(20004   , 1212866    ,    'Kindersitzbefestigung')
,(10045   ,  1212866   ,    'Lederlenkradrriegelung')
,(11908   ,  1257946   ,    'Airbag')
,(22346   , 1257946    ,    'Automatic')

;WITH SUBQUERY
AS
(
    SELECT ID,(CAST(PART_ID AS VARCHAR(12)) + ' : ' + DESCRIPTION) 'CONCATED'
    FROM @TABLE 
)

SELECT ID, LEFT(pre_trimmed.CONCATED , LEN(pre_trimmed.CONCATED )-1) AS LISTOFPARTS
FROM SUBQUERY AS extern
CROSS APPLY
(
    SELECT CONCATED + ','
    FROM SUBQUERY AS intern
    WHERE extern.ID = intern.ID
    FOR XML PATH('')
) pre_trimmed (CONCATED)
GROUP BY ID, pre_trimmed.CONCATED

【讨论】:

以上是关于SQL Server:按字符串连接分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中连接字符串,并按不同的列排序/排序?

具有不同字符的 SQL Server 组连接

连接按列分组的值

如何获取SQL server数据库的连接字符串

如何获取SQL server数据库的连接字符串

如何创建 SQL 查询来计算按日期分组和连接的项目? [关闭]