Sql server 如何将多列中的多个值合并到一行中?
我有这张桌子: 我需要将其转换为(带括号): 我可以有两次以上的同一排 在这种情况下,10有两次,但我可以有3个10,4个12,等等 我开始创建pivot表,但老实说,即使是通过查看Microsoft网站,我一辈子也无法理解这一点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; 有人愿意帮忙吗 谢谢。
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时,转换失败。错误是因为您试图将“”与整数值串联。把它扔给瓦查尔。