如何在sql server 2008中的动态sql中对row_number()进行排序

时间:2015-04-07 20:23:02

标签: sql-server-2008

我必须从下面给出的样本表中创建一个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

1 个答案:

答案 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]