【问题标题】:TSQL- csv for a column and not for the restTSQL- csv 用于列而不是其余列
【发布时间】:2017-06-24 10:57:15
【问题描述】:

我需要从一列中获取 csv,但需要从其余列中获取最小值(或任何值,因为它们对于一个组来说是相同的)。举个例子;

我有下表:

COL1        COL2        COL3        COL4
------------------------------------------
ABC         10          35          GROUP1
AQW         10          35          GROUP1
VBN         10          35          GROUP1
HJK         10          35          GROUP1
DFV         30          25          GROUP2
HYT         30          25          GROUP2
DET         30          25          GROUP2


And I want the following result:

COL1                    COL2        COL3        COL4
--------------------------------------------------------
ABC,AQW,VBN,HJK         10          35          GROUP1
DFV,HYT,DET             30          25          GROUP2

我查看了类似的场景,使用可变大小写连接 (Concatenating Column Values into a Comma-Separated List) 的解决方案不起作用,因为我将拥有多个组。我想不出这样做的方法。你能推荐一个方法吗?

【问题讨论】:

    标签: sql-server tsql csv


    【解决方案1】:

    您可以使用子查询来做到这一点,如下所示:

    创建并填充示例表(在您以后的问题中保存我们这一步)

    DECLARE @T AS TABLE
    (
        COL1 char(3),
        COL2 int,
        COL3 int,
        COL4 char(6)
    )
    
    INSERT INTO @T VALUES
    ('ABC', 10, 35, 'GROUP1'),
    ('AQW', 10, 35, 'GROUP1'),
    ('VBN', 10, 35, 'GROUP1'),
    ('HJK', 10, 35, 'GROUP1'),
    ('DFV', 30, 25, 'GROUP2'),
    ('HYT', 30, 25, 'GROUP2'),
    ('DET', 30, 25, 'GROUP2')
    

    查询:

    SELECT DISTINCT
           STUFF(
           (
               SELECT ',' + COL1
               FROM @T
               WHERE COL2 = t.COL2
               AND COL3 = t.COL3
               AND COL4 = t.COL4
               FOR XML PATH('')
           )
           , 1, 1, '') As COL1,
           COL2,
           COL3,
           COL4
     FROM @T t
    

    结果:

    COL1                COL2    COL3    COL4
    ABC,AQW,VBN,HJK     10      35      GROUP1
    DFV,HYT,DET         30      25      GROUP2
    

    【讨论】:

      【解决方案2】:

      样本数据

      DECLARE @Table1  TABLE 
          (COL1 varchar(3), COL2 int, COL3 int, COL4 varchar(6))
      ;
      
      INSERT INTO @Table1
          (COL1, COL2, COL3, COL4)
      VALUES
          ('ABC', 10, 35, 'GROUP1'),
          ('AQW', 10, 35, 'GROUP1'),
          ('VBN', 10, 35, 'GROUP1'),
          ('HJK', 10, 35, 'GROUP1'),
          ('DFV', 30, 25, 'GROUP2'),
          ('HYT', 30, 25, 'GROUP2'),
          ('DET', 30, 25, 'GROUP2')
      ;
      

      脚本

      SELECT   COL1 = STUFF(
                   (SELECT ',' + COL1 
                    FROM @Table1 t1
                    WHERE t1.COL2 = t2.COL2
                    FOR XML PATH (''))
                   , 1, 1, ''),COL2, COL3, COL4 from @Table1 t2
      group by COL2, COL3, COL4;
      

      【讨论】:

        【解决方案3】:

        STUFFGROUP BY 一起使用。

        查询

        SELECT STUFF((SELECT ',' + [COL1] 
        FROM [your_table_name]
        WHERE ([COL2] = t.[COL2] AND [COL3] = t.[COL3] AND [COL4] = t.[COL4]) 
        FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
           ,1,1,'') AS COL1, [COL2], [COL3], [COL4]
        FROM [your_table_name] t
        GROUP BY [COL2], [COL3], [COL4]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-15
          • 1970-01-01
          • 2021-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          相关资源
          最近更新 更多