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

请教个SQL语句行变列的统计写法

2012-01-18 
请问个SQL语句行变列的统计写法例如如下表客户名称材料名称重量甲A20乙B30甲B10乙A40甲C20乙A10想出如下结

请问个SQL语句行变列的统计写法
例如如下表
客户名称                 材料名称                   重量
甲                                 A                               20
乙                                 B                               30
甲                                 B                               10
乙                                 A                               40
甲                                 C                               20
乙                                 A                               10

想出如下结果
客户名称               A                       B                     C
甲                           20                     10                   20
乙                           50                     30                   0

请问sql语句该如何写

[解决办法]
create table A(客户名称 varchar(10),材料名称 varchar(10),重量 int)
insert A select '甲 ', 'A ',20
union all select '乙 ', 'B ',30
union all select '甲 ', 'B ',10
union all select '乙 ', 'A ',40
union all select '甲 ', 'C ',20
union all select '乙 ', 'A ',10

select 客户名称,A=isnull(sum(case 材料名称 when 'A ' then 重量 end),0),
B=isnull(sum(case 材料名称 when 'B ' then 重量 end),0),
C=isnull(sum(case 材料名称 when 'C ' then 重量 end),0) from A
group by 客户名称


客户名称 A B C
---------- ----------- ----------- -----------
甲 20 10 20
乙 50 30 0
[解决办法]
declare @sql varchar(8000)
set @sql= ' '

select @sql=@sql+ ', '+材料名称+ '=sum(case 材料名称 when ' ' '+材料名称+ ' ' ' then 重量 else 0 end) '
from 表 group by 材料名称

set @sql= 'select 客户名称 '+@sql+ ' from 表 group by 客户名称 '

exec(@sql)
[解决办法]
if object_id( 'pubs..tb ') is not null


drop table tb
go

create table tb(客户名称 varchar(10),材料名称 varchar(10),重量 int)
insert into tb(客户名称,材料名称,重量) values( '甲 ', 'A ',20)
insert into tb(客户名称,材料名称,重量) values( '乙 ', 'B ',30)
insert into tb(客户名称,材料名称,重量) values( '甲 ', 'B ',10)
insert into tb(客户名称,材料名称,重量) values( '乙 ', 'A ',40)
insert into tb(客户名称,材料名称,重量) values( '甲 ', 'C ',20)
insert into tb(客户名称,材料名称,重量) values( '乙 ', 'A ',10)
go

--1、静态SQL
select 客户名称 ,
sum(case when 材料名称 = 'A ' then 重量 else 0 end) A,
sum(case when 材料名称 = 'B ' then 重量 else 0 end) B,
sum(case when 材料名称 = 'C ' then 重量 else 0 end) C
from tb
group by 客户名称

--2、动态SQL
declare @sql varchar(8000)
set @sql = 'select 客户名称 '
select @sql = @sql + ' , sum(case 材料名称 when ' ' ' + 材料名称 + ' ' ' then 重量 else 0 end) [ ' + 材料名称 + '] '
from (select distinct 材料名称 from tb) as a
set @sql = @sql + ' from tb group by 客户名称 '
exec(@sql)

drop table tb

/*
客户名称 A B C
---------- ----------- ----------- -----------
甲 20 10 20
乙 50 30 0

(所影响的行数为 2 行)

客户名称 A B C
---------- ----------- ----------- -----------
甲 20 10 20
乙 50 30 0
*/
[解决办法]
select 客户名称 ,
sum(case when 材料名称 = 'A ' then 重量 else 0 end) A,
sum(case when 材料名称 = 'B ' then 重量 else 0 end) B,
sum(case when 材料名称 = 'C ' then 重量 else 0 end) C
from tb
group by 客户名称

这个sql 比较好  顶

热点排行