石井论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

快捷登录

查看: 884|回复: 0

SQL 数据透视表

[复制链接]

347

主题

2987

回帖

33

好友

白金会员

Rank: 14Rank: 14Rank: 14Rank: 14

UID
3479
石币
2660 币
精华
1
在线时间
2053 小时
注册时间
2009-6-25
发表于 2010-9-15 10:56:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
基础数据内容,需要透视的数据。
销售人员     书籍        销量
----------------------------------------
小王      Excel教材        10
小李      Excel教材        15
小王      Word教材          8
小李      Excel教材         7
小王      Excel教材         9
小李      Excel教材         2
小王      Word教材         3
小李      Excel教材         5
数据透视的方法是统计每个销售人员对每种书籍的销量 ,结果如下
----------------------------------------------------------------

销售人员        Excel教材 Word教材  总计
---------------------------------------------------------------
小王                29       0      29
小李                19      11      30
---------------------------------------------------------------

生成基础数据的代码
    <LI class=alt>Create table s(  
  • <LI class=alt>    [name] nvarchar(50),  
  •     book nvarchar(50),  <LI class=alt>    saledNumber int
  • )  <LI class=alt>
  • insert into s ([name],book,saledNumber) values('小王','Excel教材',10);  <LI class=alt>insert into s ([name],book,saledNumber)values('小李','Excel教材',15);  
  • insert into s ([name],book,saledNumber)values('小王','Word教材',8);  <LI class=alt>insert into s ([name],book,saledNumber)values('小李','Excel教材',7);  
  • insert into s ([name],book,saledNumber)values('小王','Excel教材',9);  <LI class=alt>insert into s ([name],book,saledNumber)values('小李','Excel教材',2);  
  • insert into s ([name],book,saledNumber)values('小王','Word教材',3);  
  • insert into s ([name],book,saledNumber)values('小李','Excel教材',5);
生成数据透视表
    <LI class=alt>set @sql = 'SELECT [name], '
  • select @sql = @sql + 'sum(case  book when '+quotename(book,'''')+' then saledNumber else 0 end) as ' + quotename(book)+','  
  • from s group by book  <LI class=alt>select @sql = left(@sql,len(@sql)-1)  
  • select @sql = @sql + ', sum(saledNumber) as [sum] from s group by [name]' <LI class=alt>select @sql  
  • exec(@sql)
上面的查询语句首先是拼接了一条"Sql语句",它的最终结果为:
    <LI class=alt>SELECT [name], sum(case  book when 'Excel教材' then saledNumber else 0 end)   
  • as [Excel教材],sum(case  book when 'Word教材' then saledNumber else 0 end)   
  • as [Word教材], sum(saledNumber) as [sum] from s group by [name]

当然,如果表中的数据不同,那么这生成的Sql语句也是不同的。最后它调用了Sql Server的系统存储过程Exec来执行这条语句。截个图吧。


快速回复 返回顶部 返回列表