江湖救急,SQL怎么进行“字符串”的转化?

starrycheng 2012-09-19 10:44:57
SQL语句:

declare @DateValue nvarchar(150)
declare @DateListSum nvarchar(150)
set @DateValue='2010,2011,2012'
set @DateListSum = 'sum(isnull(' +REPLACE(@DateValue,',',',0)),sum(isnull(') +',0))'

print @DateValue
print @DateListSum
print 'sum(isnull(2010,0)) 2010,sum(isnull(2011,0)) 2011,sum(isnull(2012,0)) 2012'

运行结果:

2010,2011,2012
sum(isnull(2010,0)),sum(isnull(2011,0)),sum(isnull(2012,0))
sum(isnull(2010,0)) 2010,sum(isnull(2011,0)) 2011,sum(isnull(2012,0)) 2012

问题:

现在的SQL语句中可以将“ 2010,2011,2012”转化为“sum(isnull(2010,0)),sum(isnull(2011,0)),sum(isnull(2012,0))” , 但是怎样转化为“sum(isnull(2010,0)) 2010,sum(isnull(2011,0)) 2011,sum(isnull(2012,0)) 2012” 呢???

也就是作完“sum”求和后,加上原有的列名,SQL应该怎样处理呢?
...全文
167 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
starrycheng 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

SQL code

declare @str varchar(max)
set @str='2010,2011,2012'

create table #a
(
name varchar(255)
)
declare @s varchar(max)
set @s='insert #a select '+''''+REPLACE(@str,',',''''+' union all……
[/Quote]

谢谢,大师。

处理一个变量,还用到了临时表。
starrycheng 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

建议你切割字符串再拼爹
[/Quote]

大师,怎么样切割能详细点吗?
  • 打赏
  • 举报
回复

declare @str varchar(max)
set @str='2010,2011,2012'

create table #a
(
name varchar(255)
)
declare @s varchar(max)
set @s='insert #a select '+''''+REPLACE(@str,',',''''+' union all select '+'''')+''''
--print @s
exec(@s)
declare @sql varchar(max)
set @sql=''
select @sql=@sql+','+'sum(isnull('+name+',0))'+' '+name from #a
select @sql=right(@sql,len(@sql)-1)
print @sql
/*
sum(isnull(2010,0)) 2010,sum(isnull(2011,0)) 2011,sum(isnull(2012,0)) 2012
*/
  • 打赏
  • 举报
回复

declare @str varchar(max)
set @str='2010,2011,2012'

create table #a
(
name varchar(255)
)
declare @s varchar(max)
set @s='insert #a select '+''''+REPLACE(@str,',',''''+' union all select '+'''')+''''
--print @s
exec(@s)
declare @sql varchar(max)
set @sql=''
select @sql=@sql+' '+'sum(isnull('+name+',0))'+' '+name from #a
print @sql
/*
sum(isnull(2010,0)) 2010 sum(isnull(2011,0)) 2011 sum(isnull(2012,0)) 2012

*/
快溜 2012-09-19
  • 打赏
  • 举报
回复
建议你切割字符串再拼爹
發糞塗牆 2012-09-19
  • 打赏
  • 举报
回复
那就熟练应用吧。凭你刚才的几个问题,我大概也知道你的底子了,还是先打扎实了再算吧。我不想给个新方法你还要回复一大堆,
starrycheng 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

我觉得你还是先理解这个方法吧。你的基础搞太多反而会乱掉。
[/Quote]

这个方法,已经用起来了,也理解了啊。
發糞塗牆 2012-09-19
  • 打赏
  • 举报
回复
我觉得你还是先理解这个方法吧。你的基础搞太多反而会乱掉。
starrycheng 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

SQL code

declare @str varchar(max)
set @str='2010,2011,2012'

create table #a
(
name varchar(255)
)
declare @s varchar(max)
set @s='insert #a select '+''''+REPLACE(@str,',',''''+' union all……
[/Quote]

大师的思路是这样的吧。

1、先将字符串中的每一个值存起来,可以存在“数组”或是“泛型”中,但是“SQL”里没有数组和泛型,所以用临时表代替。

2、从临时表中查询出每一条数据,进行拼接。得到想要的字符串。


谢谢大师了。


像这种情况除了创建临时表,还有其它方法吗?



starrycheng 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

不能说访问,应该是连接,因为一个连接可能会发起多个操作。都会对数据库做访问。
[/Quote]

嗯。。。
發糞塗牆 2012-09-19
  • 打赏
  • 举报
回复
不能说访问,应该是连接,因为一个连接可能会发起多个操作。都会对数据库做访问。
starrycheng 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

你的功底怎么几乎为零 啊,删除表是drop table 啊,#这种开头的临时表正常情况下会自动删除,但是作为实践经验,最好用完手动删除。#是作用在一个【会话】当中,也可以理解为一个链接。或者你在SQLServer Management studio里面新建的一个窗口等等。
[/Quote]

多谢大师指教。

前端的每一次数据库访问,就是一次会话。对吧???
發糞塗牆 2012-09-19
  • 打赏
  • 举报
回复
遇到问题时,首先多查查联机丛书,你才会有进步,比如删除表,你打开联机丛书,然后在左下方选【索引】选项卡,然后输入:删除表 就有结果了。
發糞塗牆 2012-09-19
  • 打赏
  • 举报
回复
你的功底怎么几乎为零 啊,删除表是drop table 啊,#这种开头的临时表正常情况下会自动删除,但是作为实践经验,最好用完手动删除。#是作用在一个【会话】当中,也可以理解为一个链接。或者你在SQLServer Management studio里面新建的一个窗口等等。
starrycheng 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

SQL code

declare @str varchar(max)
set @str='2010,2011,2012'

create table #a
(
name varchar(255)
)
declare @s varchar(max)
set @s='insert #a select '+''''+REPLACE(@str,',',''''+' union all……
[/Quote]

谢谢大师,这样是可以的。

create table #yearlist
(
yearname varchar(255)
)
select * from #yearlist

declare @DateValue varchar(255)
set @DateValue='2010,2011,2012'


declare @yearliststr varchar(255)
set @yearliststr='insert #yearlist select '+''''+REPLACE(@DateValue,',',''''+' union all select '+'''')+''''
--print @yearliststr
exec(@yearliststr)
declare @yearlistsql varchar(255)
set @yearlistsql=''
select @yearlistsql=@yearlistsql+','+'sum(isnull('+yearname+',0))'+' '+yearname from #yearlist
select @yearlistsql=right(@yearlistsql,len(@yearlistsql)-1)
print @yearlistsql

大师,关于“临时表”,可不可以多请教下。

问题一:" #yearlist"这样的临时表,它的作用范围是整个“SQL”文件,对吧?


问题二:这些语句实际上使用在存储过程中的。创建了" #yearlist"这样的临时表,最后要不要删掉???

问题三:删除临时表的语句应该是怎样的,“drop #yearlist”和 “delete #yearlist”都不行啊,怎么回事???

34,837

社区成员

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

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