跪求一交叉表查询语句急....................
表a
客户名称 产品名称 销量 折扣
张三 a 100 100
张三 c 100 100
李四 b 100 150
李四 a 120 110
王五 c 100 120
.. d .. ..
.. .. .. ..
.. .. .. ..
求一查询语句得到如下结果:
客户名称 备注 a b c d ..
张三 销量 100 100
张三 折扣 100 100
李四 销量 120 100
李四 折扣 110 150
王五 销量 100
王五 折扣 120
..
..
[解决办法]
declare @t table(客户名称 varchar(10),产品名称 varchar(10),销量 int,折扣 int)
insert into @t select '张三 ', 'a ',100,100
union all select '张三 ', 'c ',100,100
union all select '李四 ', 'b ',100,150
union all select '李四 ', 'a ',120,110
union all select '王五 ', 'c ',100,120
SELECT * FROM
(
SELECT 客户名称,产品名称, 列 , 列值
FROM
(SELECT 客户名称,产品名称, 销量, 折扣
FROM @t) p
UNPIVOT
(列值 FOR 列 IN
(销量, 折扣)
)AS unpvt
) TB
PIVOT
(MAX(列值)
FOR 产品名称 IN ([a],[b],[c],[d])
) as pt
order by 客户名称
--结果
/*
客户名称 列 a b c d
----------------------
李四销量120100NULLNULL
李四折扣110150NULLNULL
王五销量NULLNULL100NULL
王五折扣NULLNULL120NULL
张三销量100NULL100NULL
张三折扣100NULL100NULL
*/
[解决办法]
--创建测试环境
create table 表a(客户名称 varchar(10),产品名称 varchar(10),销量 int,折扣 int)
--插入测试数据
insert 表a(客户名称,产品名称,销量,折扣)
select '张三 ', 'a ', '100 ', '100 ' union all
select '张三 ', 'c ', '100 ', '100 ' union all
select '李四 ', 'b ', '100 ', '150 ' union all
select '李四 ', 'a ', '120 ', '110 ' union all
select '王五 ', 'c ', '100 ', '120 '
--求解过程
declare @sql varchar(8000)
set @sql = 'select 客户名称,备注 '
select @sql = @sql + ',sum(case when 产品名称 = ' ' ' + 产品名称 + ' ' '
then 数量 else 0 end) as ' + 产品名称
from (select distinct 产品名称 from 表a) x
select @sql = @sql
+ ' from (
select 客户名称,产品名称,销量 as 数量, ' '销量 ' ' as 备注 from 表a
union all
select 客户名称,产品名称,折扣, ' '折扣 ' ' from 表a
) x
group by 客户名称,备注 order by 客户名称,备注 '
exec( @sql)
--删除测试环境
drop table 表a
/*--测试结果
客户名称 备注 a b c
---------- ---- ----------- ----------- -----------
李四 销量 120 100 0
李四 折扣 110 150 0
王五 销量 0 0 100
王五 折扣 0 0 120
张三 销量 100 0 100
张三 折扣 100 0 100
*/