SQL Server 2008 R2:动态数据透视表查询

SQL Server 2008 R2: Dynamic pivot query

我将 table 称为销售额,其中包含三列 SalesCountrySalesStateSalesMan ,如下所示:

Table:

create table sales
(
     SalesCountry varchar(20),
     SalesState varchar(20),
     SalesMan varchar(20)
);

插入:

insert into sales values('USA','TEXAS','Mak');
insert into sales values('USA','California','Sam');
insert into sales values('Cannada','Alberta','John');
insert into sales values('Cannada','Manitoba','John');  

现在我要展示的结果如下:

County      State1      State2      SalesMan1   SalesMan2
---------------------------------------------------------
USA         TEXAS       California  Mak         Sam
Cannada     Alberta     Manitoba    John        NULL

注意:数据透视查询应该是动态的,它应该按照table中的行显示列,增量为1,列名像i已显示 State1,State2 可能有 State3,State4,,,,,,n。在我的示例中,只有四行,也可能不止四行。

使用 PIVOT 我们可以实现这个

    DECLARE @sales table 
    (
         SalesCountry varchar(20),
         SalesState varchar(20),
         SalesMan varchar(20)
    );

    insert into @sales values('USA','TEXAS','Mak');
    insert into @sales values('USA','California','Sam');
    insert into @sales values('Cannada','Alberta','John');
    insert into @sales values('Cannada','Manitoba','John');  

Select SalesCountry,MAX([1]) State1,MAX([2]) State2,MAX([Sales_1])[Sales_1],MAX([Sales_2])[Sales_2]  FROM (
select 
SalesCountry,
SalesState,
SalesMan,
ROW_NUMBER()OVER(PARTITION BY SalesCountry ORDER BY SalesCountry)RN ,
'Sales'+'_'+CAST(ROW_NUMBER()OVER(PARTITION BY SalesCountry ORDER BY SalesCountry) AS VARCHAR)RNN
    FROM @sales
    )T
PIVOT (MAX(SalesState) for RN IN ([1],[2]))P
PIVOT (MAX(SalesMan) for RNN IN ([Sales_1],[Sales_2]))PP
GROUP BY PP.SalesCountry