我有下面提到的表:
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
中列出的列顺序与表中的列相同。
答案 0 :(得分:5)
添加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。
答案 1 :(得分:0)
这是因为您在DISTINCT
查询中使用了SELECT
。如果查看执行计划,可以看到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,'')