我有这张桌子:
我需要将其转换为(也要加上括号):
row_nbr - row_label - default_order
10 - TOTAL ACCOUNTABLE GROSS - (1, 3)
12 - DEDUCTIBLE TERMS - (3)
20 - TOTAL DEDUCTIBLE TERMS - (3)
34 - AMOUNT DUE (UNRECOUPED) - (4)
36 - ACCOUNTABLE GROSS - (2)
41 - TOTAL CONTINGENT COMPENSATION - (3)
同一row_nbr可能有两倍以上。
在这种情况下,十个有两次,但是我可以有三个10,四个12等。
我有点启动了透视表,但说实话,即使通过查看Microsoft网站,我也无法一生解决这个问题。
select row_nbr, row_label, default_order
from #temp
pivot
(
max(row_nbr)
for default_order in (default_order)
) piv;
有人愿意帮助吗?
谢谢。
答案 0 :(得分:3)
正如@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;
您可以在this blog post
中了解更多信息答案 1 :(得分:0)
PIVOTS绝对很想获得控制。幸运的是,在这种情况下,虽然您可以使用一个作为中间步骤,但没有必要。 PIVOT将获取每个值并将其放入对应的不同列中,而您想要的是一个单独的列,它们都串联在一起。就像我说的那样,您可以可以进行数据透视,然后将所有生成的列连接在一起,但这比所需的工作更多。
2014年,最简单的方法是使用FOR 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