首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

跪求一交叉表查询语句急解决方案

2012-02-03 
跪求一交叉表查询语句急....................表a客户名称产品名称销量折扣张三a100100张三c100100李四b100

跪求一交叉表查询语句急....................
表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
*/

热点排行