高手请进,高难度行转列问题 再讨论
--建立测试环境
Create Table T(Item varchar(4),Type varchar(4),Qty integer)
--插入数据
insert into T
select 'A','T1','2' union
select 'A','T2','5' union
select 'B','T2','1' union
select 'B','T3','4' union
select 'C','T1','10' union
select 'D','T4','2' union
select 'E','','0' union
select 'F','','10'
go
--查询处理
DECLARE @SQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL= @SQL+ ','+quotename(case when Type='' then ' ' else Type end)
+'=isnull(sum(CASE Type when '+quotename(type,'''')+' THEN Qty END),0)'
FROM T A GROUP BY Type
exec('
select Item=case when grouping(Item)=1 then ''SUM'' else Item end'+@SQL+'
,TOTAL=sum(Qty) from T group by Item with rollup')
go
--删除测试环境
Drop Table T
/*--结果
Item T1 T2 T3 T4 TOTAL
---- ----------- ----------- ----------- ----------- ----------- -----------
A 0 2 5 0 0 7
B 0 0 1 4 0 5
C 0 10 0 0 0 10
D 0 0 0 0 2 2
E 0 0 0 0 0 0
F 10 0 0 0 0 10
SUM 10 12 6 4 2 34
问题1:可否直接去除第二列(列名为空的那列)
问题2:现有表TYPENAME
type name
T1 N1
T2 N2
T3 N3
T4 N4
希望以上显示的结果表的列名用name(n1,n2...),不用t1,t2..
问题3:
原有表s1改成(增加列PKG)
Item Type Qty PKG
A T1 2 P1
A T2 5 P1
B T2 1 P1
B T3 4 P1
C T1 10 P2
D T4 2 P2
E '' 0 P2
显示结果需为
PKG NAME T1 T2 T3 T4 T5 TOTAL
P1 A 2 5 0 0 0 7
P1 B 0 1 4 0 0 5
P1 C 10 0 0 0 0 10
SUM 12 6 4 0 0 22
P2 D 0 0 0 2 0 2
P2 E 0 0 0 0 0 0
SUM 0 0 0 2 0 2
TOTAL 12 6 4 2 0 24