快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

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

原始表如下格式:
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
返回类别: 教程
上一教程: 为数据库建立索引(二)
下一教程: MS SQL SERVER中如何得到表的创建语句

您可以阅读与"常常用到的交叉表问题,一般用动态SQL能生成动态列!"相关的教程:
· 关于MSSQL占用过多内存的问题
· 如何解决SQL SERVER 2000中的连接问题
· SQL SERVER 数据库治理常用的SQL和T-SQL语句
· SQL SERVER应用问题解答13例(一)
· 关于MYSQL 4.1语言问题的完美解决方式
    微笑服务 优质保证 索取样品