請教高手:這個SQL語句怎麼下?

caliphliao 2004-11-23 10:29:18
我的資料庫如下
Month F1 F2 F3 F4 F5
200401 400 300 200 600 800
200402 300 800 600 400 700

我要的資料是
Fld 200401 200402
F1 400 300
F2 300 800
F3 200 600
F4 600 400
F5 800 700
...全文
206 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
davorsuker39 2004-11-23
  • 打赏
  • 举报
回复
学习
zhang_yzy 2004-11-23
  • 打赏
  • 举报
回复
又是个交叉表的问题,建议邹老大开个专题,讲一下,那样就不会反复的有人问相似的问题了
dxai 2004-11-23
  • 打赏
  • 举报
回复
好!!!!!
zjcxc 2004-11-23
  • 打赏
  • 举报
回复
上面的方法,对于Month的值没有任何要求,可以根据表中的值动态决定字段
同时,如果你的字段数变化了,也不需要修改处理过程
zjcxc 2004-11-23
  • 打赏
  • 举报
回复
--示例

--测试数据
create table 表([Month] int,F1 int,F2 int,F3 int,F4 int,F5 int)
insert 表 select 200401,400,300,200,600,800
union all select 200402,300,800,600,400,700
go

--查询处理
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)'
,@s2=@s2+',@'+@i+'=''[Fid]='''''+name+''''''''
,@s3=@s3+'
,@'+@i+'=@'+@i+'+'',[''+cast([Month] as varchar)+'']=''+cast(['+name+'] as varchar)'
,@s4=@s4+',@'+@i+'=''select ''+@'+@i
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns
where object_id('表')=id and name<>'Month'

select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s3=stuff(@s3,1,4,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')

exec('declare '+@s1+'
select '+@s2+'
select '+@s3+'
from 表
select '+@s4+'
exec('+@s5+')')
go

--删除测试
drop table 表

/*--测试结果

Fid 200401 200402
---- ----------- -----------
F1 400 300
F2 300 800
F3 200 600
F4 600 400
F5 800 700

(所影响的行数为 5 行)
--*/
lsxaa 2004-11-23
  • 打赏
  • 举报
回复
哈哈 这个方法太笨了 期待更好的
lsxaa 2004-11-23
  • 打赏
  • 举报
回复
select a.fld,a.[200401],b.[200402] from (
select 'f1' as Fld,f1 as [200401] from 资料库 where Month='200401'
select 'f2' as Fld,f2 as [200401] from 资料库 where Month='200401'
select 'f3' as Fld,f3 as [200401] from 资料库 where Month='200401'
select 'f4' as Fld,f4 as [200401] from 资料库 where Month='200401'
select 'f5' as Fld,f5 as [200401] from 资料库 where Month='200401') a,
(
select 'f1' as Fld,f1 as [200402] from 资料库 where Month='200402'
select 'f2' as Fld,f2 as [200402] from 资料库 where Month='200402'
select 'f3' as Fld,f3 as [200402] from 资料库 where Month='200402'
select 'f4' as Fld,f4 as [200402] from 资料库 where Month='200402'
select 'f5' as Fld,f5 as [200402] from 资料库 where Month='200402') b
where a.fld=b.fld



yown 2004-11-23
  • 打赏
  • 举报
回复
与楼上老邹的等值语句,这样看到更清晰点。。。。
=============================================================
declare @1 varchar(8000), @2 varchar(8000), @3 varchar(8000), @4 varchar(8000), @5 varchar(8000)

select @1='fid=''f1''',@2='fid=''f2''',@3='fid=''f3''',@4='fid=''f4''',@5='fid=''f5'''

select @1=@1+',['+cast(month as varchar)+']='+cast(f1 as varchar)
,@2=@2+',['+cast(month as varchar)+']='+cast(f2 as varchar)
,@3=@3+',['+cast(month as varchar)+']='+cast(f3 as varchar)
,@4=@4+',['+cast(month as varchar)+']='+cast(f4 as varchar)
,@5=@5+',['+cast(month as varchar)+']='+cast(f5 as varchar)

from 表

exec('select '+@1+' union all '+'select '+@2+' union all '+'select '+@3+' union all '+'select '+@4+' union all '+'select '+@5)

================================================================
didoleo 2004-11-23
  • 打赏
  • 举报
回复
收藏起来漫漫研究
caliphliao 2004-11-23
  • 打赏
  • 举报
回复
謝謝老鄒!

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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