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

How to keep column order same in dynamic pivot

我在下面提到了 table :

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 中列出的列顺序与 table.

中列出的顺序相同

添加一个 GROUP BY 和一个 ORDER BY 子句(以替换 DISTINCT),您可以在其中构建列列表,如下所示:

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

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

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

要保留顺序,你可以试试这个:

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,'')