0

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
1
  • My suggestion would be to create your row_number() in a subquery, then use that value to order by your columns. Commented Apr 7, 2015 at 20:36

1 Answer 1

1

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]
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.