我必须从下面给出的样本表中创建一个Pivot -
State Country
------------------------------
ALA Almaty Kazakhstan
AMD Ahmedabad India
AMM Amman Jordan
AMS Amsterdam Netherlands
ATH Athens Greece
AUH Abu Dhabi United Arab Emirates
BAH Manama Bahrain
我通过动态sql执行此操作,因为我想在pivot中使用动态列。我的问题是我无法在动态SQL中对ROW_NUMBER()
生成的值进行排序。下面提到的代码中的变量@var1
将输出作为 -
[1],[10],[11],[2],[3],[4],[5],[6],[7],[8],[9]
不按排序顺序。
declare @myvar nvarchar(max)
declare @var1 nvarchar(max)
declare @new nvarchar(max)
set @var1 = (select stuff((select distinct '],[' + cast(ROW_NUMBER() over ( partition by country order by (select 1)) as varchar(100)) from sheet
for xml path('')),1,2,'') + ']')
select @var1
set @myvar =
'select * from
(select *,ROW_NUMBER() over (partition by country order by (select 1)) as rn
from sheet
)as abc
pivot
(
max([state]) for rn
in (' + @var1 + ')
) as pvt'
set @new = 'select * into ##a from (' + @myvar + ') as t'
exec sp_executesql @new
答案 0 :(得分:1)
你可以试试这个:
WITH cte
AS ( SELECT ROW_NUMBER() OVER ( PARTITION BY country ORDER BY ( SELECT 1 ) ) rn
FROM sheet
)
SELECT @var1 = STUFF(( SELECT '],[' + CAST(rn AS NVARCHAR(MAX))
FROM cte
GROUP BY rn
ORDER BY rn
FOR XML PATH('') ), 1, 2, '') + ']'
SELECT @var1
对于测试数据,它可以工作:
DECLARE @t TABLE ( i INT )
DECLARE @var1 NVARCHAR(MAX)
INSERT INTO @t
VALUES ( 1 ),
( 1 ),
( 2 ),
( 2 ),
( 2 ),
( 3 ),
( 3 ),
( 3 ),
( 3 ),
( 3 ),
( 3 ),
( 3 ),
( 3 ),
( 3 ),
( 3 ),
( 3 ),
( 4 ),
( 4 );
WITH cte
AS ( SELECT ROW_NUMBER() OVER ( PARTITION BY i ORDER BY ( SELECT 1 ) ) rn
FROM @t
)
SELECT @var1 = STUFF(( SELECT '],[' + CAST(rn AS NVARCHAR(MAX))
FROM cte
GROUP BY rn
ORDER BY rn
FOR XML PATH('') ), 1, 2, '') + ']'
SELECT @var1
输出:
[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11]