一个sql语句,帮我解释一下

xupeihuagudulei 2009-09-28 10:18:54

SELECT @sql = @sql + ', SUM(CASE ExamDate WHEN ''' + CONVERT(varchar(20), ExamDate, 102) + ''' THEN ScoreValue ELSE NULL END)''' + CAST(YEAR(ExamDate) AS VARCHAR) + '年' + CAST(MONTH(ExamDate) AS VARCHAR) + '月' + CAST(DAY(ExamDate) AS VARCHAR) + '日'''

每次这个字符串里面多几个单引号我就受不鸟了
看不懂。
昏得慌。
我只知道在字符串里面两个引号算一个,
可是这句话我怎么理解都不行啊
理解不了。
谁给解释下,
高分,
这问题困扰很久了
上次发过
就没解释。
可能分太少,
这次多些
也是我难得在SQL版发这么高的分
100分。(100很难积的。。)
大家来看看。。
...全文
241 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
一直活在明天 2009-09-28
  • 打赏
  • 举报
回复
lz print @sql 一下就能看到什么意思了。
xupeihuagudulei 2009-09-28
  • 打赏
  • 举报
回复
结帖吧,虽然还有些昏。
幸运的意外 2009-09-28
  • 打赏
  • 举报
回复
这是一个动态生成合计的语句吧.
dawugui 2009-09-28
  • 打赏
  • 举报
回复
create table tb(id int, ExamDate datetime, val int)
insert into tb values(1,getdate(),1)
insert into tb values(1,getdate()-1,2)
insert into tb values(1,getdate()-2,3)
insert into tb values(2,getdate()-1,1)
insert into tb values(2,getdate()-2,2)
go

declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , max(case CONVERT(varchar(10), ExamDate, 120) when ''' + CONVERT(varchar(10), ExamDate, 120) + ''' then val else 0 end) [' + datename(yy,ExamDate)+'年'+datename(mm,ExamDate)+'月'+ datename(dd,ExamDate)+'日]'
from (select distinct ExamDate from tb) as a
set @sql = @sql + ' from tb group by id'
exec(@sql)

drop table tb

/*
id 2009年09月26日 2009年09月27日 2009年09月28日
----------- ----------- ----------- -----------
1 3 2 1
2 2 1 0
*/
dawugui 2009-09-28
  • 打赏
  • 举报
回复
create table tb(id int, ExamDate datetime, val int)
insert into tb values(1,getdate(),1)
insert into tb values(1,getdate()-1,2)
insert into tb values(1,getdate()-2,3)
insert into tb values(2,getdate()-1,1)
insert into tb values(2,getdate()-2,2)
go

declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , max(case CONVERT(varchar(10), ExamDate, 120) when ''' + CONVERT(varchar(10), ExamDate, 120) + ''' then val else 0 end) [' + stuff(stuff(CONVERT(varchar(10), ExamDate, 120),5,1,'年'),8,1,'月') + '日]'
from (select distinct ExamDate from tb) as a
set @sql = @sql + ' from tb group by id'
exec(@sql)

drop table tb

/*
id 2009年09月26日 2009年09月27日 2009年09月28日
----------- ----------- ----------- -----------
1 3 2 1
2 2 1 0
*/
knifewei 2009-09-28
  • 打赏
  • 举报
回复
好久没看铁了,呵呵呵,回归一下
华夏小卒 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 navy887 的回复:]
小卒写的比我快。。呵呵。。
[/Quote]
soft_wsx 2009-09-28
  • 打赏
  • 举报
回复
@sql + ', SUM(CASE ExamDate WHEN ''' + CONVERT(varchar(20), ExamDate, 102) + ''' THEN ScoreValue ELSE NULL END)''' --分开解释下这句
@sql + ', SUM(CASE ExamDate WHEN '''-- 这里有4个引号,第一个和第4是一对,第二和第三转成一个引号
CONVERT(varchar(20), ExamDate, 102) + ''' THEN ScoreValue ELSE NULL END)''' --这里有6个引号,第1个和第6是一对,第二和第三转成一个引号和上边一句的单引号是一对.
一次类推。。


引号是吧!
对于SQL 中的字符中用单引号,对于字符串中出现的字符用两个单引号
xupeihuagudulei 2009-09-28
  • 打赏
  • 举报
回复
多谢大家,
我这次一定要把这引号的问题搞明白了。
明白后结帖
navy887 2009-09-28
  • 打赏
  • 举报
回复
@sql + ', SUM(CASE ExamDate WHEN ''' + CONVERT(varchar(20), ExamDate, 102) + ''' THEN ScoreValue ELSE NULL END)'''  --分开解释下这句 
@sql + ', SUM(CASE ExamDate WHEN '''-- 这里有4个引号,第一个和第4是一对,第二和第三转成一个引号
CONVERT(varchar(20), ExamDate, 102) + ''' THEN ScoreValue ELSE NULL END)''' --这里有6个引号,第1个和第6是一对,第二和第三转成一个引号和上边一句的单引号是一对.
一次类推。。
soft_wsx 2009-09-28
  • 打赏
  • 举报
回复
来晚了!
navy887 2009-09-28
  • 打赏
  • 举报
回复
小卒写的比我快。。呵呵。。
navy887 2009-09-28
  • 打赏
  • 举报
回复
@sql + ', SUM(CASE ExamDate WHEN ''' + CONVERT(varchar(20), ExamDate, 102) + ''' THEN ScoreValue ELSE NULL END)''' --分开解释下这句
@sql + ', SUM(CASE ExamDate WHEN '''-- 这里有4个引号,第一个和第4是一对,第二和第三转成一个引号
CONVERT(varchar(20), ExamDate, 102) + ''' THEN ScoreValue ELSE NULL END)''' --这里有6个引号,第1个和第6是一对,第二和第三转成一个引号和上边一句的单引号是一对.
一次类推。。
xupeihuagudulei 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 fredrickhu 的回复:]
是这样的 如果说不注意的话 很多人还是会写错 你可以试着自己写 不对的地方print(@sql)来看 引号的配对自然就明白了
[/Quote]OK,试试去
感觉这方法自己最记得住。
华夏小卒 2009-09-28
  • 打赏
  • 举报
回复

SELECT @sql = @sql
+ ', SUM(CASE ExamDate WHEN ''' ---这3个引号,最后一个是和这行第一个配对,前面2个代表1个单引号 ①
+ CONVERT(varchar(20), ExamDate, 102)
+ ''' THEN ScoreValue ELSE NULL END)''' ---本行第一个、最后一个为一对引号。另外实际分别为2个引号,第一个和上面的 ①配对,另一个和下面的②配对
+ CAST(YEAR(ExamDate) AS VARCHAR) + '年'
+ CAST(MONTH(ExamDate) AS VARCHAR) + '月'
+ CAST(DAY(ExamDate) AS VARCHAR) + '日''' --中间2个为一个引号 ②


select CONVERT(varchar(20), getdate(), 102) --- 2009.09.28
--小F-- 2009-09-28
  • 打赏
  • 举报
回复
是这样的 如果说不注意的话 很多人还是会写错 你可以试着自己写 不对的地方print(@sql)来看 引号的配对自然就明白了
ws_hgo 2009-09-28
  • 打赏
  • 举报
回复
说白了
引号的作用就是动态拼接
xupeihuagudulei 2009-09-28
  • 打赏
  • 举报
回复
那些函数各位大大就不需要解释啦
xupeihuagudulei 2009-09-28
  • 打赏
  • 举报
回复
SELECT @sql = @sql 
+ ', SUM(CASE ExamDate WHEN ''' --我就是不理解这里三个引号的意义。。
+ CONVERT(varchar(20), ExamDate, 102) --判断ExamDate 是否为 ExamDate ,格式如下面的
+ ''' THEN ScoreValue ELSE NULL END)''' --等于则为ScoreValue。否则为空
+ CAST(YEAR(ExamDate) AS VARCHAR) + '年' --再加上下面这3个字符串
+ CAST(MONTH(ExamDate) AS VARCHAR) + '月'
+ CAST(DAY(ExamDate) AS VARCHAR) + '日'''


select CONVERT(varchar(20), getdate(), 102) --- 2009.09.28
xupeihuagudulei 2009-09-28
  • 打赏
  • 举报
回复
越看我贴的那代码头越晕。了
加载更多回复(18)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧