SQL Server 2008 R2:动态数据透视表查询
SQL Server 2008 R2: Dynamic pivot query
我将 table 称为销售额,其中包含三列 SalesCountry
、 SalesState
和 SalesMan
,如下所示:
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
我将 table 称为销售额,其中包含三列 SalesCountry
、 SalesState
和 SalesMan
,如下所示:
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