假设有一个表如下:
日期 | 时间 | 售货金额 |
2006-01-02 | 早上 | 50 |
2006-01-02 | 中午 | 20 |
2006-01-02 | 晚上 | 30 |
2006-01-02 | 零晨 | 40 |
2006-01-03 | 早上 | 40 |
2006-01-03 | 中午 | 60 |
2006-01-03 | 晚上 | 50 |
2006-01-03 | 零晨 | 50 |
2006-01-04 | 早上 | 80 |
2006-01-04 | 中午 | 60 |
2006-01-04 | 晚上 | 20 |
2006-01-04 | 零晨 | 40 |
能否用行转列的方式在进行数据查询中将上面数据的查询结果显示为:
日期 | 早上 | 中午 | 晚上 | 零晨 | 金额小计 |
2006-01-02 | 50 | 20 | 30 | 40 | 140 |
2006-01-03 | 40 | 60 | 50 | 50 | 200 |
2006-01-04 | 80 | 60 | 30 | 20 | 190 |
......... |
SQL 2005中的处理方式:
测试环境
Create table T(日期 datetime,时间 varchar(20),售货金额 int) insert into T select '2006-01-02','早上',50 union all select '2006-01-02','中午',20 union all select '2006-01-02','晚上',30 union all select '2006-01-02','零晨',40 union all select '2006-01-03','早上',40 union all select '2006-01-03','中午',60 union all select '2006-01-03','晚上',50 union all select '2006-01-03','零晨',50 union all select '2006-01-04','早上',80 union all select '2006-01-04','中午',60 union all select '2006-01-04','晚上',20 union all select '2006-01-04','零晨',40
查询
select * ,金额小计=(select sum(售货金额) from T where 日期=PT.日期 ) from T as TAB PIVOT ( max(售货金额) for 时间 in ([早上],[中午],[晚上],[零晨]) ) as PT
结果:
日期 | 早上 | 中午 | 晚上 | 零晨 | 金额小计 |
2006-01-02 00:00:00.000 | 50 | 20 | 30 | 40 | 140 |
2006-01-03 00:00:00.000 | 40 | 60 | 50 | 50 | 200 |
2006-01-04 00:00:00.000 | 80 | 60 | 20 | 40 | 200 |
删除测试环境
Drop Table T
动态SQL:
DECLARE @S VARCHAR(MAX) SET @S='' SELECT @S=@S+',['+时间+']' FROM T GROUP BY 时间 SET @S=STUFF(@S,1,1,'') EXEC(' select 日期,'+@S+',金额小计=(select sum(售货金额) from T where 日期=PT.日期 ) from T as TAB PIVOT ( max(售货金额) for 时间 in ('+@S+') ) as PT ')