如何将多个列中的多个值合并为一行?

时间:2018-10-12 22:14:26

标签: sql-server pivot

我有这张桌子:

我需要将其转换为(也要加上括号):

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;

有人愿意帮助吗?

谢谢。

2 个答案:

答案 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)的答案几乎涵盖了该技术的工作原理(尽管您可以选择这样做的方式有一些变体)。

如果您明确知道这些值都是整数,则可以节省一些键入操作,并省略typevalue运算符,因为只有在必须转义某些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