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个单引号么?
答
最后把语句全部组合。先分组,在 case when.
新建存储过程步骤:查询-->新建-->创建文本存储过程