您的位置:首页 > 数据库

动态SQL,交叉表例子

2010-02-01 18:54 204 查看
感觉就是把竖着的N条记录,查成横向的很多列,搬个例子记录下。

思路:通过查询原表的记录,动态去构造一个varchar变量,然后调用exec(),执行该变量中的sql语句。

原始表格式如下:

ClassCallDateCallCount
12005-8-840
12005-8-76
22005-8-877
22005-8-933
32005-8-89
32005-8-721
根据Class的值,按日期分别统计出CallCount1,CallCount2,CallCount3。

当该日期无记录时值为0。要求合并成如下格式:

CallDateCallCount1CallCount2CallCount3
2005-8-90033
2005-8-840779
2005-8-76021
--创建测试环境
[code]CreatetableT(Classvarchar(2),CallDatedatetime,CallCountint)
insertintoTselect'1','2005-8-8',40
unionallselect'1','2005-8-7',6
unionallselect'2','2005-8-8',77
unionallselect'3','2005-8-9',33
unionallselect'3','2005-8-8',9
unionallselect'3','2005-8-7',21
--动态SQL
declare@svarchar(8000)
set@s='selectCallDate'
select@s=
@s+',[CallCount'+Class+']=sum(casewhenClass='''+Class+'''thenCallCountelse0end)'
fromTgroupbyClass
set@s=@s+'fromTgroupbyCallDateorderbyCallDatedesc'
exec(@s)
--删除测试环境
droptableT

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

--结果

CallDateCallCount1CallCount2CallCount3
2005-08-0900:00:00.0000033
2005-08-0800:00:00.00040779
2005-08-0700:00:00.0006021
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: