Sql server 如何将多列中的多个值合并到一行中?

Sql server 如何将多列中的多个值合并到一行中?,sql-server,pivot,Sql Server,Pivot,我有这张桌子: 我需要将其转换为(带括号): 我可以有两次以上的同一排 在这种情况下,10有两次,但我可以有3个10,4个12,等等 我开始创建pivot表,但老实说,即使是通过查看Microsoft网站,我一辈子也无法理解这一点 select row_nbr, row_label, default_order from #temp pivot ( max(row_nbr) for default_order in (default_order) ) piv; 有人愿意帮忙吗 谢谢。

我有这张桌子:

我需要将其转换为(带括号):

我可以有两次以上的同一排

在这种情况下,10有两次,但我可以有3个10,4个12,等等

我开始创建pivot表,但老实说,即使是通过查看Microsoft网站,我一辈子也无法理解这一点

select row_nbr, row_label, default_order
from #temp
pivot
(
  max(row_nbr)
  for default_order in (default_order)
) piv;
有人愿意帮忙吗


谢谢。

正如@Vinit所说,您可以在2017年使用string_agg函数,但如果您至少在2005年,您可以使用一个可怕的、折磨人的XML生成器:

SELECT  row_nbr
       ,row_label
       ,default_order = '(' +
            STUFF( 
            (SELECT ', ' + CAST(default_order AS VARCHAR(10))
            FROM        #temp
            WHERE       row_nbr = t.row_nbr
            ORDER BY    default_order
            FOR XML PATH('') ,
                ROOT('MyString'),
                TYPE ).value('/MyString[1]', 'varchar(max)'), 1, 2, '')
            + ')'
FROM    #temp t;

您可以在

中了解更多关于它的信息,正如@Vinit所说,您可以在2017年使用string_agg函数,但如果您至少在2005年,您可以使用一个可怕、折磨人的XML生成器:

SELECT  row_nbr
       ,row_label
       ,default_order = '(' +
            STUFF( 
            (SELECT ', ' + CAST(default_order AS VARCHAR(10))
            FROM        #temp
            WHERE       row_nbr = t.row_nbr
            ORDER BY    default_order
            FOR XML PATH('') ,
                ROOT('MyString'),
                TYPE ).value('/MyString[1]', 'varchar(max)'), 1, 2, '')
            + ')'
FROM    #temp t;

你可以在

中读到更多关于它的信息,支点绝对是不可靠的。幸运的是,在这种情况下,虽然您可以使用一个作为中间步骤,但这并不是必需的。PIVOT将获取每个值并将其放入相应的独立列中,您需要的是一个单独的列,并将它们连接在一起。就像我说的,你可以做透视,然后把所有生成的列连接在一起,但是这比需要做的工作要多

2014年,最简单的方法是对XML使用
。Russell Fox的回答几乎涵盖了这项技术的工作原理(尽管如果您选择的话,您可以如何做到这一点还有一些变体)

如果确定值都是整数,则可以省去一些键入操作,省略
type
value
运算符,因为只有在必须转义字符串字段中的某些XML字符时才需要这些运算符

select
    row_nbr,
    row_label,
    default_order,
    stuff
    (
        (
            select concat(',', default_order)
            from #temp i
            where i.row_nbr = o.row_nbr
            for xml path('')
        ), 1, 1, '' 
    )

from #temp o

支点很难抓住。幸运的是,在这种情况下,虽然您可以使用一个作为中间步骤,但这并不是必需的。PIVOT将获取每个值并将其放入相应的独立列中,您需要的是一个单独的列,并将它们连接在一起。就像我说的,你可以做透视,然后把所有生成的列连接在一起,但是这比需要做的工作要多

2014年,最简单的方法是对XML使用
。Russell Fox的回答几乎涵盖了这项技术的工作原理(尽管如果您选择的话,您可以如何做到这一点还有一些变体)

如果确定值都是整数,则可以省去一些键入操作,省略
type
value
运算符,因为只有在必须转义字符串字段中的某些XML字符时才需要这些运算符

select
    row_nbr,
    row_label,
    default_order,
    stuff
    (
        (
            select concat(',', default_order)
            from #temp i
            where i.row_nbr = o.row_nbr
            for xml path('')
        ), 1, 1, '' 
    )

from #temp o

您有哪个版本的sql server?如果是2017年,那么您可以检查此新函数,以使用group将字符串连接到其2014,您使用的是哪个版本的sql server?如果是2017年,则您可以检查此新函数以使用group by连接字符串,不幸的是,它的2014原因是,我收到一条错误消息:将varchar值“”转换为数据类型int时转换失败。转换varchar值“”时转换失败,错误是因为您尝试连接“”,'使用整数值。将其转换为varchar。谢谢,但我收到一条错误消息:将varchar值“”转换为数据类型int时,转换失败。将varchar值“”转换为int时,转换失败。错误是因为您试图将“”与整数值串联。把它扔给瓦查尔。