sql 字符串拼接 实现交叉表

ALTER PROCEDURE dbo.存储过程1
AS
declare @date nvarchar(7)
declare @nsql nvarchar(4000)
set @nsql =''

declare date_cursor cursor for
select distinct convert(varchar(7),完成日期,120) as AAA from [21发货合计材质] order by AAA

open date_cursor
fetch next from date_cursor  into @date
while  @@fetch_status =0
begin
   set @nsql = @nsql + ',sum( case (convert(varchar(7), 完成日期, 120))  when ''' + @date + ''' then
                完成重量 else 0 end) as ''' + @date + ''''
   fetch next from date_cursor into  @date
end
close date_cursor
deallocate date_cursor

set @nsql = 'select table_cz.材质, sum(table_cz.完成重量) as 重量合计' + @nsql +  'from [21发货合计材质] as table_cz group by 材质  order by 材质'

EXECUTE sp_executesql @nsql


这是一个可以实现类似交叉表功能的语句。

首先来分析下思路

所谓的列标题,这里就是所有的年月,因为这里的年月随时间是变化的,所以要先把这个动态集先求出来。

select distinct convert(varchar(7),完成日期,120) as AAA from [21发货合计材质] order by AAA

完了,根据case  when 的语法,把所有的年月情况先组合成连续的语句

 

while @@fetch_status =0

begin 

set @nsql = @nsql + ',sum( case (convert(varchar(7), 完成日期, 120)) when ''' + @date + ''' then 完成重量 else 0 end) as ''' + @date + '''' f

etch next from date_cursor into @date

end


 这里说明下''' + @date + '''  的含义  第一个' 是字符串开始的标志 第二三个表是一个 ' 的意思 ,后面三个类推。其实结果就是 '@date' ,注意 第一个是字符串开始的标志。详如下解释

exec('delete from '+@TableName+ ' where ImportTime = '''+@Imp_Date+'''') end

大神们能帮我解释下最后为什么要4个单引号么?

在SQL字符串是以单引号作为分界符的,在字符串前面和后面各一个单引号。但是字符串中也能包含单引号,为了使语法分析器能够区分字符串中的单引号还是分界符。规定当字符串中出现单引号时,在其前面添加一个单引号作为区分。也就是说, 在单引号分隔的字符串中,两个连续的单引号''表示一个单引号字符。
最后的四个连续单引号分界为: 
第一个单引号,字符串的开始分界符。
接下来连续的两个单引号,表示字符串的值(一个单引号)
第四个单引号,字符串的结束分界符。

 

 最后把语句全部组合。先分组,在 case when.



新建存储过程步骤:查询-->新建-->创建文本存储过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值