六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 26|回复: 0

SQLServer 使用变量动态行转列

[复制链接]

升级  49.33%

34

主题

34

主题

34

主题

秀才

Rank: 2

积分
124
 楼主| 发表于 2013-1-26 13:43:26 | 显示全部楼层 |阅读模式
drop table #test
create table #test
(
    id int identity(1,1) primary key,
    bizDate varchar(50),
    type varchar(50),
    qty float
)
insert into #test
select '20110501','A',20.5 union all
select '20110501','B',98 union all
select '20110501','C',100.5 union all
select '20110501','A',32 union all
select '20110501','C',76.8 union all
select '20110502','B',58 union all
select '20110502','A',111 union all
select '20110502','A',51 union all
select '20110502','A',85 union all
select '20110502','B',52 union all
select '20110502','C',43 union all
select '20110503','A',158 union all
select '20110503','C',58 union all
select '20110503','B',28 union all
select '20110503','B',65 union all
select '20110503','A',11 union all
select '20110503','A',25 union all
select '20110503','C',63
 
 
declare @sql varchar(8000)
set @sql = 'select type' 
select @sql = @sql + ' , SUM(CASE WHEN bizDate=''' + bizDate + ''' then qty else 0 end) [' + bizDate + ']'
from (select distinct bizDate from #test) as a order by bizDate--此行的SQL用于找出不重复的日期,也就是结果集中所有的日期
set @sql = @sql + ' from #test A group by type'
print @sql
exec(@sql)
 

--打印出来的完整SQL是:
select type ,
       SUM(CASE WHEN bizDate='20110501' then qty else 0 end) [20110501] ,
       SUM(CASE WHEN bizDate='20110502' then qty else 0 end) [20110502] ,
       SUM(CASE WHEN bizDate='20110503' then qty else 0 end) [20110503]
       from #test A group by type
 

      
/*
PS. SQLServer里的中括号作用:
 若表名、字段名、列名等与数据库里的关键字有冲突,则可以给该表名或字段名加上"[]"以识区别。
 上面的例子中是以日期作为列名,也可用"[]"标识
*/
 
 
 
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

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