【问题标题】:TSQL - Comma Separated Values for a specific column [duplicate]TSQL - 特定列的逗号分隔值[重复]
【发布时间】:2019-03-19 07:20:52
【问题描述】:

我正在寻求解决一个问题,其中我的 SQL 表具有以下表定义:

UniqueID    GroupID   DepartmentID
-----------------------------------
    1          2      D005
    2          2      D006
    3          2      D007
    4          5      D002
    5          1      D006
    6          3      D001
    7          3      D009
    8          3      D002
    9          3      D004
   10          3      D006

此表存储属于特定组的不同部门的信息。

我正在寻找一个简单且优化的查询,该查询将部门列表作为逗号分隔值(在同一行中)针对每个组输出 输出应该是这样的:

GroupID      DepartmentList
-----------------------------
   2         D005,D006,D007
   5         D002
   1         D006
   3         D001,D009,D002,D004,D006

【问题讨论】:

  • 这里没有表定义
  • @jtate 我是堆栈溢出的新手,我无法应用适当的格式,所以我将表定义粘贴为 HTML 表。您可以运行代码 sn-ps 来查看表定义以及我想要的输出。
  • 如果您使用的是 SQL Server 2017,则有 STRING_AGG。如果没有,旧版本的 SQL Server 有很多解决方法
  • 你真的应该检查一下 - 这已经被问过 1000 次,每次都得到完全相同(正确)的答案。顺便说一句,答案已经完成了创建插入语句的工作 - 如果您首先将它们添加到您的问题中,那么每个人都会更容易。

标签: sql-server tsql string-aggregation


【解决方案1】:

我使用了下表定义。

IF EXISTS(SELECT * FROM [sys].[objects] WHERE [object_id]=OBJECT_ID(N'Table1') AND [TYPE]=N'U')
DROP TABLE Table1
; 

CREATE TABLE Table1
(
  [UniqueID] [int]
, [GroupID] [int]
, [DepartmentID] [varchar](4) NULL
);

INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(1, 2, 'D005');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(2, 2, 'D006');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(3, 2, 'D007');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(4, 5, 'D002');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(5, 1, 'D006');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(6, 3, 'D001');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(7, 3, 'D009');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(8, 3, 'D002');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(9, 3, 'D004');
INSERT INTO Table1 ([UniqueID], [GroupID], [DepartmentID]) VALUES(10, 3, 'D006');

为了在一个语句中运行它,我使用了 CTE 和从值中选择。然后我使用STUFF 函数连接字符串值。

WITH
source_data
AS
(
    SELECT Table1.* FROM (VALUES
      ( 1, 2, 'D005')
    , ( 2, 2, 'D006')
    , ( 3, 2, 'D007')
    , ( 4, 5, 'D002')
    , ( 5, 1, 'D006')
    , ( 6, 3, 'D001')
    , ( 7, 3, 'D009')
    , ( 8, 3, 'D002')
    , ( 9, 3, 'D004')
    , ( 10, 3, 'D006')
    ) Table1 ([UniqueID], [GroupID], [DepartmentID]) 
)
SELECT DISTINCT
      [GroupID]
    , [DepartmentList] = STUFF
    ( 
        (
            SELECT 
                ',' + id2.[DepartmentID] 
            FROM 
                source_data AS id2
            WHERE 
                id1.[GroupID] = id2.[GroupID]
            GROUP BY 
                id2.[DepartmentID]
            FOR XML PATH(''), TYPE
        ).value('.', 'varchar(max)')
        ,1,1,''
    )
FROM 
    source_data AS id1

db<>fiddle

结果:

【讨论】:

  • 这非常适合我。感谢您详细说明它,使我易于理解。谢谢
  • 无忧伴侣,随时随地
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2011-07-26
  • 2013-07-05
相关资源
最近更新 更多