【问题标题】:Can I create this in sql server? [duplicate]我可以在 sql server 中创建它吗? [复制]
【发布时间】:2017-10-18 04:09:38
【问题描述】:

我有如下表格:

Locaiton Val1   Val2
L1       1      2
L1       0      5
L1       4      1
L1       7      8
L2       1      3
L2       6      1
L2       2      11
L2       0      2
L2       6      3
L2       8      4
L2       1      1

我想像下面这样转换它: 位置 Val1 Val2

Location    Val1            Val2
L1          1,0,4,7,1,6     2,5,1,8,3,1
L2          2,0,6,7,1       11,2,3,4,1

【问题讨论】:

  • 你需要使用STUFF

标签: sql-server concatenation


【解决方案1】:

你可以使用如下的东西

select [Location], stuff ((
select ',' + val1 from #Table1 where [Location] = t.[Location] 
for xml path('')
),1,1,'') as Val1,
stuff ((
select ',' + val2 from #Table1 where [Location] = t.[Location] 
for xml path('')
),1,1,'') as Val2
from #Table1 t
group by [Location]

如果是sql server 2017或者vnext可以使用string_agg

select [Location], val1 = string_agg(val1,','), val2 = string_agg(val2,',')
    from #table1 
group by [Location]

【讨论】:

    【解决方案2】:

    这是一种痛苦。您需要执行两次字符串连接技巧:

    select t.location,
           stuff( (select ',' + cast(val1 as varchar(255))
                   from t t2
                   where t2.location = t.location
                   for xml path ('')
                  ), 1, 1, ''
                ) as val1s,
           stuff( (select ',' + cast(val2 as varchar(255))
                   from t t2
                   where t2.location = t.location
                   for xml path ('')
                  ), 1, 1, ''
                ) as val2s
    from (select distinct location from t) t;
    

    请注意,每个列表中 id 的顺序是不确定的。这就是 SQL 的工作原理。如果您希望它们按特定顺序排列,则需要将ORDER BY 添加到子查询中。您的示例数据没有明显的排序列。

    【讨论】:

      【解决方案3】:

      您可以通过以下查询,

          SELECT  Location
              ,STUFF((SELECT DISTINCT ','+CAST(Val1 AS NVARCHAR)
                      FROM YourTable t
                      WHERE t.Location = Location),1,1,'')    AS Val1
              ,STUFF((    SELECT DISTINCT ','+CAST(Val2 AS NVARCHAR)
                  FROM YourTable t
                  WHERE t.Location = Location),1,1,'')    AS Val2
      FROM YourTable
      GROUP BY Location
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 2020-02-02
        • 2010-11-23
        • 2018-07-23
        • 2019-11-26
        • 1970-01-01
        • 2015-01-03
        相关资源
        最近更新 更多