小弟现在会些初级的SQL查询,想学一些复杂点的SQL查询语句以提高做出来的东西的性能.
像前几天在论坛里看到的以下这样的SQL...我就看不懂....请教下大家我该从哪里开始学?create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
select UserName,sum(case when Subject= '数学' then Score else 0 end) [数学],sum(case when Subject= '物理' then Score else 0 end) [物理],sum(case when Subject= '语文' then Score else 0 end) [语文]
declare @sql varchar(1000)
set @sql='select UserName'
select @sql=@sql+',sum(case when Subject= ''' +Subject+ ''' then Score else 0 end) ['+Subject+']' from (select distinct Subject from tb)aset @sql = @sql + ' from tb group by UserName'
print @sql
exec(@sql)
像前几天在论坛里看到的以下这样的SQL...我就看不懂....请教下大家我该从哪里开始学?create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
select UserName,sum(case when Subject= '数学' then Score else 0 end) [数学],sum(case when Subject= '物理' then Score else 0 end) [物理],sum(case when Subject= '语文' then Score else 0 end) [语文]
declare @sql varchar(1000)
set @sql='select UserName'
select @sql=@sql+',sum(case when Subject= ''' +Subject+ ''' then Score else 0 end) ['+Subject+']' from (select distinct Subject from tb)aset @sql = @sql + ' from tb group by UserName'
print @sql
exec(@sql)
解决方案 »
- SQL2005 郁闷的问题
- 字符串截取转换问题,请各位达淫踊跃发言
- 麻烦看看,求一SQl语句:
- 请问怎样把存储过程sp_tables 的结果放进一张表里面啊? 可以用select into .....吗?
- 数据类型为uniqueidentifier字段可以保存图像文件吗
- 我想选择最新的30条记录,但是又想把这选出来的30条记录按时间由早到晚的顺序排序,该怎么办?
- 请问SET NOCOUNT ON如何使用?
- 求救:MySQL安装失败……
- 100分求教用SQL SERVER2000 还原备份数据库的问题,急!!!冰天雪地裸体跪求!!!
- 求以存储过程`````
- 又有个小题目,请教各位
- 计算时间差的函数返回null!
1 :普通SQL语句可以用Exec执行 eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名 declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确 3. 输出参数
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中? declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
这个例题好像是个行列装换吧 很经典的 你可以先尝试的用3条记录转的看看
不用他的拼凑的方法
2、group by 中 sum 与 case 相结合的用法