表A 如下:商品名称 日期 销量
A 2006-11-20 100
A 2006-11-21 110
A 2006-11-27 222
B 2006-11-22 110
B 2006-11-24 170
C 2006-11-15 160
C 2006-11-26 330
... ... ...
求格式如下:
商品名称 2006-11-15 2006-11-16 ...... 2006-11-27 日平均
A 222
B
C 160
A 2006-11-20 100
A 2006-11-21 110
A 2006-11-27 222
B 2006-11-22 110
B 2006-11-24 170
C 2006-11-15 160
C 2006-11-26 330
... ... ...
求格式如下:
商品名称 2006-11-15 2006-11-16 ...... 2006-11-27 日平均
A 222
B
C 160
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94 想变成
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94 create table #t
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
) insert into #t(Name , Subject , Result) values('张三','语文','73')
insert into #t(Name , Subject , Result) values('张三','数学','83')
insert into #t(Name , Subject , Result) values('张三','物理','93')
insert into #t(Name , Subject , Result) values('李四','语文','74')
insert into #t(Name , Subject , Result) values('李四','数学','83')
insert into #t(Name , Subject , Result) values('李四','物理','93') declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
from (select distinct Subject from #t) as a
set @sql = @sql + ' from #t group by name'
exec(@sql) drop table #t --结果
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 83 93 74
张三 83 93 73
如果上述两表互相换一下:即 姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94 想变成 Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94 create table #t
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
) insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93)
insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94) select 姓名 as Name,'语文' as Subject,语文 as Result from #t union
select 姓名 as Name,'数学' as Subject,数学 as Result from #t union
select 姓名 as Name,'物理' as Subject,物理 as Result from #t
order by 姓名 desc drop table #t
Name Subject Result
---------- ------- -----------
张三 数学 83
张三 物理 93
张三 语文 73
李四 数学 84
李四 物理 94
李四 语文 74 (所影响的行数为 6 行)
set @sql=''select @sql=@sql+',['+日期+']='sum(case 日期 when '''+日期+''' then 销量 else 0 end)'
from (select distinct convert(char(10),日期,120) as 日期 from 表A) tset @sql='select 商品名称'+@sql+',日平均=avg(销量) from 表A group by 商品名称'exec(@sql)
insert into test select 'A','2006-11-20',100
insert into test select 'A','2006-11-21',110
insert into test select 'A','2006-11-27',222
insert into test select 'B','2006-11-22',110
insert into test select 'B','2006-11-24',170
insert into test select 'C','2006-11-15',160
insert into test select 'C','2006-11-26',330
go
declare @sql varchar(8000)
set @sql=''select @sql=@sql+',['+日期+']=sum(case 日期 when '''+日期+''' then 销量 else 0 end)'
from (select distinct convert(char(10),日期,120) as 日期 from test) tset @sql='select 商品名称'+@sql+',日平均=avg(销量) from test group by 商品名称'exec(@sql)
go/*
商品名称 2006-11-15 2006-11-20 2006-11-21 2006-11-22 2006-11-24 2006-11-26 2006-11-27 日平均
------ ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
A 0 100 110 0 0 0 222 144
B 0 0 0 110 170 0 0 140
C 160 0 0 0 0 330 0 245
*/drop table test
go
drop table tb
gocreate table tb
(
商品名称 char(1),
日期 char(10),
销量 int
)insert into tb(商品名称,日期,销量) values('A','2006-11-20',100)
insert into tb(商品名称,日期,销量) values('A','2006-11-21',110)
insert into tb(商品名称,日期,销量) values('A','2006-11-27',222)
insert into tb(商品名称,日期,销量) values('B','2006-11-22',110)
insert into tb(商品名称,日期,销量) values('B','2006-11-24',170)
insert into tb(商品名称,日期,销量) values('C','2006-11-15',160)
insert into tb(商品名称,日期,销量) values('C','2006-11-26',330)declare @sql varchar(8000)
set @sql = ''
select @sql = @sql + ' , max(case 日期 when ''' + 日期 + ''' then 销量 else 0 end) [' + 日期 + ']'
from (select distinct 日期 from tb) as a
set @sql = 'select m.* , n.日平均 from ' +
'(select 商品名称' + @sql + ' from tb group by 商品名称) m , '+
'(select 商品名称 , sum(销量)/count(*) as 日平均 from tb group by 商品名称) n ' +
'where m.商品名称 = n.商品名称'
exec(@sql) drop table tb商品名称 2006-11-15 2006-11-20 2006-11-21 2006-11-22 2006-11-24 2006-11-26 2006-11-27 日平均
-------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------
A 0 100 110 0 0 0 222 144
B 0 0 0 110 170 0 0 140
C 160 0 0 0 0 330 0 245
drop table tb
gocreate table tb
(
商品名称 char(1),
日期 datetime,
销量 int
)insert into tb(商品名称,日期,销量) values('A','2006-11-20',100)
insert into tb(商品名称,日期,销量) values('A','2006-11-21',110)
insert into tb(商品名称,日期,销量) values('A','2006-11-27',222)
insert into tb(商品名称,日期,销量) values('B','2006-11-22',110)
insert into tb(商品名称,日期,销量) values('B','2006-11-24',170)
insert into tb(商品名称,日期,销量) values('C','2006-11-15',160)
insert into tb(商品名称,日期,销量) values('C','2006-11-26',330)declare @sql varchar(8000)
set @sql = ''
select @sql = @sql + ' , max(case convert(varchar(10),日期,120) when ''' + convert(varchar(10),日期,120) + ''' then 销量 else 0 end) [' + convert(varchar(10),日期,120) + ']'
from (select distinct 日期 from tb) as a
set @sql = 'select m.* , n.日平均 from ' +
'(select 商品名称' + @sql + ' from tb group by 商品名称) m , '+
'(select 商品名称 , sum(销量)/count(*) as 日平均 from tb group by 商品名称) n ' +
'where m.商品名称 = n.商品名称'
exec(@sql) drop table tb商品名称 2006-11-15 2006-11-20 2006-11-21 2006-11-22 2006-11-24 2006-11-26 2006-11-27 日平均
-------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------
A 0 100 110 0 0 0 222 144
B 0 0 0 110 170 0 0 140
C 160 0 0 0 0 330 0 245
insert A select 'A', '2006-11-20', 100
union all select 'A', '2006-11-21', 110
union all select 'A', '2006-11-27', 222
union all select 'B', '2006-11-22', 110
union all select 'B', '2006-11-24', 170
union all select 'C', '2006-11-15', 160
union all select 'C', '2006-11-26', 330declare @sql nvarchar(4000)
set @sql='select PdtName, '
select @sql=@sql+quotename(convert(char(10), Date, 120))+'=sum(case when Date='+quotename(Date, '''')+' then Sales else 0 end), ' from A group by Date
select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from A group by PdtName '
exec(@sql)
--result
PdtName 2006-11-15 2006-11-20 2006-11-21 2006-11-22 2006-11-24 2006-11-26 2006-11-27
------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
A 0 100 110 0 0 0 222
B 0 0 0 110 170 0 0
C 160 0 0 0 0 330 0
drop table t_testcreate table t_test
(sale_name varchar(20),
date datetime,
sale_qty int)insert into t_Test
select 'A', '2006-11-20', 100 union
select 'A', '2006-11-21', 110 union
select 'A', '2006-11-27', 222 union
select 'B', '2006-11-22', 110 union
select 'B', '2006-11-24', 170 union
select 'C', '2006-11-15', 160 union
select 'C', '2006-11-26', 330 select * from t_testdeclare @sql varchar(8000)
set @sql = ''
select @sql = @sql + ',min(case when date = cast( ''' + convert(varchar(10) , date , 121 )+ ''' as datetime) then sale_qty end ) as ''' + convert(varchar(10) , date , 121 ) + ''''
from t_test
group by dateselect @sql = 'select sale_name ' + @sql + ' from t_test group by sale_name'
print @sql
exec( @sql)drop table t_test
-----------------------------------IT者--IT开发者的网站
www.itzhe.cn