急~!SQl动态行转列插入动态临时表

zxheng87 2009-10-14 07:31:48
临时表的结构:
有固定几个字段,然后为可变动列
create table #DepYearDes
(
FID varchar(36),
FCode nvarchar(80),---部门代码
FAmount decimal(18,2),---费用

declare @s varchar(8000),@month varchar(8)
set @month='20080101'
set @s='alter table #DepYearDes add f'+@month+' int'
while dateadd(month,1,convert(datetime,@month)) <'2009-01-01'
begin
set @month=convert(varchar(8),dateadd(month,1,convert(datetime,@month)),112)
set @s=@s+',f'+@month+' int'
end
exec(@s)

临时表的月份是变动的,现在需要把查询出来的结果转换成临时表的结构插进去,查询出来的结果如下
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/1 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/2 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/3 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/4 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/5 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/6 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/7 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/8 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/9 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/10 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/11 1987878.80

把查询的结果变成行一条记录插进临时表。跪求~解决方法~~!谢谢。
...全文
711 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxheng87 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xlyt 的回复:]
12个月的信息?不如加12个字段简单。
[/Quote]
那要是36个月呢??大哥
XLYT 2009-10-14
  • 打赏
  • 举报
回复
12个月的信息?不如加12个字段简单。
jimwoo 2009-10-14
  • 打赏
  • 举报
回复
那就动态SQL了

declare @sql varchar(8000), @dt1 datetime, @dt2 datetime
set @dt1 = '2008-1-1'
set @dt2 = '2009-12-31'

set @sql = 'select fcode'
select @sql = @sql + ', sum(case convert(char(6), 日期, 112) when ''' + 年月 + ''' then 金额 else 0 end) as [f' + 年月 + ']'
from (select distinct convert(char(6), 日期, 112) as 年月 from 表 where 日期 between @dt1 and @dt2) as a order by 年月
set @sql = @sql + ' FROM 表 where convert(char(6), 日期, 112) between ''' + convert(char(6), @dt1, 112) + ''' and ''' + convert(char(6), @dt2, 112) + ''' group by fcode'
exec(@sql)
zxheng87 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jimwoo 的回复:]
这里的#DepYearDes是可以访问的
只要select ... into就可以了,不需要先建临时表
SQL codeselect fcode,sum(casewhenconvert(char(6), fdate,112)='200801'then amtelse0end)as[200801],sum(casewhenconvert(char(6), fdate,112)='200802'then amtelse0end)as[200802],sum(casewhenconvert(char(6), fdate,112)='200803'then amtelse0end)as[200803],sum(casewhenconvert(char(6), fdate,112)='200804'then amtelse0end)as[200804],sum(casewhenconvert(char(6), fdate,112)='200805'then amtelse0end)as[200805],sum(casewhenconvert(char(6), fdate,112)='200806'then amtelse0end)as[200806],sum(casewhenconvert(char(6), fdate,112)='200807'then amtelse0end)as[200807],sum(casewhenconvert(char(6), fdate,112)='200808'then amtelse0end)as[200808],sum(casewhenconvert(char(6), fdate,112)='200809'then amtelse0end)as[200809],sum(casewhenconvert(char(6), fdate,112)='200810'then amtelse0end)as[200810],sum(casewhenconvert(char(6), fdate,112)='200811'then amtelse0end)as[200811],sum(casewhenconvert(char(6), fdate,112)='200812'then amtelse0end)as[200812]into #DepYearDesfrom ktk_gckgroupby fcode
[/Quote]
呃 '200801'这个只是个参数 我要是选择2年24个月是不是得写24行啊。
zxheng87 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jimwoo 的回复:]
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00        2008/1 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/2 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/3 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/4 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/5 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/6 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/7 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/8 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/9 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/10 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/11 1987878.80
这是要的结果还是原始表的数据?
[/Quote]

这是我查询出来的数据怎么处理变成临时表对应的月份。
jimwoo 2009-10-14
  • 打赏
  • 举报
回复
这里的#DepYearDes是可以访问的
只要select ... into就可以了,不需要先建临时表
select fcode, sum(case when convert(char(6), fdate, 112) = '200801' then amt else 0 end) as [200801],
sum(case when convert(char(6), fdate, 112) = '200802' then amt else 0 end) as [200802],
sum(case when convert(char(6), fdate, 112) = '200803' then amt else 0 end) as [200803],
sum(case when convert(char(6), fdate, 112) = '200804' then amt else 0 end) as [200804],
sum(case when convert(char(6), fdate, 112) = '200805' then amt else 0 end) as [200805],
sum(case when convert(char(6), fdate, 112) = '200806' then amt else 0 end) as [200806],
sum(case when convert(char(6), fdate, 112) = '200807' then amt else 0 end) as [200807],
sum(case when convert(char(6), fdate, 112) = '200808' then amt else 0 end) as [200808],
sum(case when convert(char(6), fdate, 112) = '200809' then amt else 0 end) as [200809],
sum(case when convert(char(6), fdate, 112) = '200810' then amt else 0 end) as [200810],
sum(case when convert(char(6), fdate, 112) = '200811' then amt else 0 end) as [200811],
sum(case when convert(char(6), fdate, 112) = '200812' then amt else 0 end) as [200812]
into #DepYearDes from ktk_gck group by fcode
zxheng87 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sql77 的回复:]
在EXEC中实现的临时表,外面是不能用的
[/Quote]
外面不使用 就是显示一个查询的结果而已
zxheng87 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 navy887 的回复:]
不要用临时表,用实际的表吧
[/Quote]
不能用表,因为这个月份是变动的,月份的那个列是变动的。
zxheng87 2009-10-14
  • 打赏
  • 举报
回复
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/1 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/2 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/3 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/4 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/5 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/6 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/7 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/8 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/9 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/10 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/11 1987878.80
是查询出来的结果。将这结果按临时表的结构保存到临时表。应该是一条记录保存完以后
navy887 2009-10-14
  • 打赏
  • 举报
回复
不要用临时表,用实际的表吧
--小F-- 2009-10-14
  • 打赏
  • 举报
回复
这个用临时表处理了也没有什么意义啊
SQL77 2009-10-14
  • 打赏
  • 举报
回复
在EXEC中实现的临时表,外面是不能用的
SQL77 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiequan2 的回复:]
exec里面产生的临时表,在exec外面是访问不到的,实现了也没什么用的,~~
[/Quote]
正是,同意
jimwoo 2009-10-14
  • 打赏
  • 举报
回复
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/1 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/2 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/3 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/4 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/5 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/6 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/7 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/8 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/9 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/10 1987878.80
0D577D88-A705-45E5-987B-E83BF61B4172 001 100000.00 2008/11 1987878.80
这是要的结果还是原始表的数据?
xiequan2 2009-10-14
  • 打赏
  • 举报
回复
exec里面产生的临时表,在exec外面是访问不到的,实现了也没什么用的,~~
bancxc 2009-10-14
  • 打赏
  • 举报
回复
有行转列的例子看一下 不难
华夏小卒 2009-10-14
  • 打赏
  • 举报
回复
看不懂
ximi82878 2009-10-14
  • 打赏
  • 举报
回复
貌似网上有行列转换的语句吧?楼主可以找一下
gsk09 2009-10-14
  • 打赏
  • 举报
回复
动态语句与临时表不在一个层级,用实表吧,简单一点。

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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