动态SQL
求一些动态SQL的例子,最好带一点解释。谢谢
------解决方案--------------------
--行列转换
/*
id salary
-----------------
1 2000-3000
----------------
2 4000-5000
*/
--生成测试数据:
go
if OBJECT_ID('tbl') is not null
drop table tbl
go
create table tbl(
id int,
salary varchar(10)
)
go
insert tbl
select 1,'2001-3000' union all
select 2,'3001-4000' union all
select 3,'4001-5000' union all
select 4,'5001-6000' union all
select 5,'6001-7000'
select *from tbl
select *from tbl where LEFT(salary,CHARINDEX('-',salary)-1) between 2000 and 5000
and right(salary,CHARINDEX('-',salary)-1) between 2000 and 5000
/*
id salary
1 2001-3000
2 3001-4000
3 4001-5000
*/
/*
现有表[Hong_Props],表中的字段如下:
PropID PropGameType PropArrea type PropTime Props PropsCoun
1 1 1 金币 2012-02-11 道具A 24
2 2 2 金币 2012-02-11 道具B 15
3 1 1 绑定金币 2012-02-12 道具C 14
4 2 1 金币 2012-02-12 道具D 2
5 2 2 金币 2012-02-13 道具D 50
6 1 2 绑定金币 2012-02-14 道具B 9
7 2 2 绑定金币 2012-02-15 道具E 10
8 1 1 金币 2012-02-15 道具A 20
先我要得到的查询效果为:
日期 道具A 道具B 道具C 道具D 道具E 累计
2012-02-11 24 15 0 0 0 39
2012-02-12 0 0 14 2 0 16
2012-02-13 0 0 0 50 0 50
2012-02-14 0 9 0 0 10 19
2012-02-15 20 0 0 0 10 30
*/
--生成测试数据:
go
if OBJECT_ID('Hong_Props')is not null
drop table Hong_Props
go
create table Hong_Props(
PropID int,
PropGameType int,
PropArrea int,
PropTime date,
Props varchar(20),
PropsCoun int
)
go
insert Hong_Props
select 1 ,1 ,1 ,'2012-02-11' ,'道具A' ,24 union all
select 2 ,2 ,2 ,'2012-02-11' ,'道具B' ,15 union all
select 3 ,1 ,1 ,'2012-02-12' ,'道具C' ,14 union all
select 4 ,2 ,1 ,'2012-02-12' ,'道具D' ,2 union all
select 5 ,2 ,2 ,'2012-02-13' ,'道具D' ,50 union all
select 6 ,1 ,2 ,'2012-02-14' ,'道具B' ,9 union all
select 7 ,2 ,2 ,'2012-02-15' ,'道具E' ,10 union all
select 8 ,1 ,1 ,'2012-02-15' ,'道具A' ,20
declare @str varchar(1000)
set @str=''
select @str=@str+','+Props+
'=max(case when Props='+quotename(Props,'''')+' then PropsCoun else 0 end)'
from Hong_Props
group by Props
--print @str
select @str='select PropTime'+@str+',sum(PropsCoun) as 累计 from Hong_Props group by PropTime'
--print @str
exec (@str)
/*
PropTime 道具A 道具B 道具C 道具D 道具E 累计
2012-02-11 24 15 0 0 0 39
2012-02-12 0 0 14 2 0 16
2012-02-13 0 0 0 50 0 50
2012-02-14 0 9 0 0 0 9
2012-02-15 20 0 0 0 10 30
*/
--你这个查询也就是很标准的行列转换问题,动态实现的基本方法就是拼接查询语句