Reputation: 1304
I have to create a Pivot from the below given sample table -
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
I am doing this by dynamic sql as i want dynamic columns in pivot. My problem is that I am not able to sort values generated by ROW_NUMBER()
in dynamic SQL. The variable @var1
in the below mentioned code is giving output as -
[1],[10],[11],[2],[3],[4],[5],[6],[7],[8],[9]
which is not in sorted order.
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
Upvotes: 0
Views: 351
Reputation: 35790
You can try this:
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
For test data it works:
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
Output:
[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11]
Upvotes: 1