当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 经常用到的交叉表问题,一般用动态SQL能生成动态列!

MSSQL
金额阿拉伯数字转换为中文的自定义函数
关于SQL SERVER建立索引需要注意的问题
怎样获得SQL Server的优化性能?
收集SQL Server统计信息
不通过dsn访问sql server
简化SQL语句一例
数据库的数据挖掘概述(一)
数据库的数据挖掘概述(二)
谈数据库中模糊数据的输入与判别
ms sql删除重复的记录
SQL语句性能调整原则
通过HTTP访问SQL Server 2000数据库
使用SQL Server 将现有代码作为Web 服务提供
自定义用于ASP Web站点的SQL 7.0数据库(1)
自定义用于ASP Web站点的SQL 7.0数据库(2)
数据库查询结果的动态排序(1)
数据库查询结果的动态排序(2)
数据库查询结果的动态排序(3)
数据库查询结果的动态排序(4)
数据库查询结果的动态排序(5)

MSSQL 中的 经常用到的交叉表问题,一般用动态SQL能生成动态列!


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 80 ::
收藏到网摘: n/a

 

原始表如下格式:
Class     CallDate    CallCount
1     2005-8-8    40
1     2005-8-7    6
2     2005-8-8    77
3     2005-8-9    33
3     2005-8-8    9
3     2005-8-7    21

根据Class的值,按日期分别统计出CallCount1,CallCount2,CallCount3。
当该日期无记录时值为0
要求合并成如下格式:
CallDate  CallCount1  CallCount2  CallCount3
2005-8-9  0       0       33
2005-8-8  40      77      9
2005-8-7  6       0       21


--创建测试环境
Create table  T  (Class varchar(2),CallDate datetime, CallCount int)
insert into T select '1','2005-8-8',40
union all select '1','2005-8-7',6
union all select '2','2005-8-8',77
union all select '3','2005-8-9',33
union all select '3','2005-8-8',9
union all select '3','2005-8-7',21
--动态SQL
declare @s varchar(8000)
set @s='select CallDate '
select @s=@s+',[CallCount'+Class+']=sum(case when Class='''+Class+''' then CallCount else 0 end)'
from T
group by Class
set @s=@s+' from T group by CallDate order by CallDate desc '
exec(@s)

--结果

CallDate                                               CallCount1  CallCount2  CallCount3 
------------------------------------------------------ ----------- ----------- -----------
2005-08-09 00:00:00.000                                0           0           33
2005-08-08 00:00:00.000                                40          77          9
2005-08-07 00:00:00.000                                6           0           21

--删除测试环境

drop table T