如何在动态数据透视中保持列顺序相同

时间:2015-07-06 03:16:19

标签: sql-server sql-server-2008-r2

我有下面提到的表:

drn RecNum  Name            Value
----------------------------------------------
1   1       ad1_pk          1
2   1       ad1_address1    P.O. Box 5036
3   1       ad1_address2    NULL
4   1       ad1_address3    NULL
5   1       ad1_ctyfk       56
6   1       ad1_postalcode  80155-5036
7   1       ad1_active      Y
8   1       ad1_irstat      A
9   1       ad1_irdata      NULL
10  1       ad1_at1fk       1
1   2       ad1_pk          2
2   2       ad1_address1    1871 S. Broadway
3   2       ad1_address2    NULL
4   2       ad1_address3    NULL
5   2       ad1_ctyfk       1
6   2       ad1_postalcode  80210
7   2       ad1_active      Y
8   2       ad1_irstat      A
9   2       ad1_irdata      NULL
10  2       ad1_at1fk       1

我正在使用下面提到的查询创建数据透视:

declare @var nvarchar(max)
declare @sql nvarchar(max)

set @var =  stuff((select distinct ',' + name from temp
                        for xml path('')),1,1,'') -- **this is giving distinct column list but the order of columns get changed..**

set @sql = 'select * from temp
pivot(max(value) for name in (' + @var + ')) as pvt'

exec sp_executesql @sql

有没有办法保持列的顺序不变?我希望@var中列出的列顺序与表中的列相同。

2 个答案:

答案 0 :(得分:5)

添加GROUP BYORDER BY子句(以替换构建列列表的DISTINCT),如下所示:

set @var =  stuff((select ',' + min(name) from temp GROUP BY drn ORDER BY drn
                        for xml path('')),1,1,'') 

并且不要忘记必要的聚合(我已经使用了MIN())。谢谢@Ionic。

答案 1 :(得分:0)

这是因为您在DISTINCT查询中使用了SELECT。如果查看执行计划,可以看到DISTINCT SORT操作。这会根据您指定的DISTINCT列对结果进行排序,在这种情况下,它会Name

enter image description here

要保留订单,您可以尝试:

set @var =  stuff((
                select ',' + name 
                from(
                    select
                        name,
                        drn,
                        rn = row_number() over(partition by name order by drn)
                    from temp
                )t
                where rn = 1
                order by drn
                for xml path('')),
            1,1,'')