十万火急 快救我吧

wenhuilasan 2003-11-13 02:26:49
各位GG,JJ们,我是一个 SQL SERVER 的初学者!
表1
字段1(fsid) 字段2(fsmachname) 字段3(fsdate) 字段4(fsname) 字段5(fsnumber)
1001 EZ-2100 03-02-10 打印头 2A
1001 EZ-2100 03-02-10 感应器 2B
1001 EZ-2100 03-02-10 机号 2C
1002 EZ-4TS 03-02-11 打印头 3B
1002 EZ-4TS 03-02-11 感应器 2E
1003 EZ-4TKP 03-08-10 打印头 5A


我想把以上的 FSID 的值相同的作为一个新表中的一条记录(其中 FSID 相同的记录条数是动态的)如下

新表
fsid fsmachname fsdate 打印头 感应器 机号
1001 EZ-2100 03-02-10 2A 2B 2C
1002 EZ-4TS 03-02-11 3B 2E
1003 EZ-4TKP 03-08-10 5A

...全文
93 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengdali 2003-11-13
  • 打赏
  • 举报
回复
--得到新表

declare @sql varchar(8000)
set @sql = 'select fsid,fsmachname,fsdate'
select @sql = @sql + ',max(case fsname when '''+fsname+''' then fsnumber end) ['+fsname+']'
from (select distinct fsname from 表1) as a
select @sql = @sql+' into 新表 from 表1 group by fsid,fsmachname,fsdate'

exec(@sql)


select * from 新表

go
pengdali 2003-11-13
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select fsid,fsmachname,fsdate'
select @sql = @sql + ',max(case fsname when '''+fsname+''' then fsnumber end) ['+fsname+']'
from (select distinct fsname from 表1) as a
select @sql = @sql+' from 表1 group by fsid,fsmachname,fsdate'

exec(@sql)
go
zjcxc 2003-11-13
  • 打赏
  • 举报
回复
--如果fsname很多,改用下面的方法

declare @sqlhead varchar(8000),@sqlend varchar(8000)
,@sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000),@sql4 varchar(8000)
,@i int,@ic varchar(20)

--生成数据处理临时表
select id=identity(int,0,1),gid=0
,a=',['+fsname+']=max(case fsname when '''
+fsname+''' then fsnumber else '''' end)'
into # from(select distinct fsname from 表1) a

--判断需要多少个变量来处理
select @i=max(len(a)) from #
set @i=7800/@i

--分组临时表
update # set gid=id/@i
select @i=max(gid) from #

--生成数据处理语句
select @sqlhead='''select fsid,fsmachname,fsdate'''
,@sqlend=''' from 表1 group by fsid,fsmachname,fsdate'''
,@sql1='',@sql2='select ',@sql3='',@sql4=''

while @i>=0
select @ic=cast(@i as varchar),@i=@i-1
,@sql1='@'+@ic+' varchar(8000),'+@sql1
,@sql2=@sql2+'@'+@ic+'='''','
,@sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic
+char(13)+@sql3
,@sql4=@sql4+',@'+@ic

select @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13)
,@sql2=left(@sql2,len(@sql2)-1)+char(13)
,@sql3=left(@sql3,len(@sql3)-1)
,@sql4=substring(@sql4,2,8000)

--执行
exec( @sql1+@sql2+@sql3+'
exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'
)

--删除临时表
drop table #
zjcxc 2003-11-13
  • 打赏
  • 举报
回复
--改一下,如果fsname的值不固定,就用:

declare @s varchar(8000)
set @s=''
select @s=@s+',['+fsname+']=max(case fsname when '''+fsname+''' then fsnumber else '''' end)'
from(select distinct fsname from 表1) a

exec('select fsid,fsmachname,fsdate'+@s+'from 表1 group by fsid,fsmachname,fsdate')
zjcxc 2003-11-13
  • 打赏
  • 举报
回复
--如果fsname的值不固定,就用:

declare @s varchar(8000)
set @s=''
select @s=@s+',['+fsname+']=max(case fsname when '''+fsname+''' then fsnumber else '' end)'
from(select distinct fsname from 表1) a

exec('select fsid,fsmachname,fsdate'+@s+'from 表1 group by fsid,fsmachname,fsdate')

zjcxc 2003-11-13
  • 打赏
  • 举报
回复
select fsid,fsmachname,fsdate
,打印头=max(case fsname when '打印头' then fsnumber else '' end)
,感应器=max(case fsname when '感应器' then fsnumber else '' end)
,机号=max(case fsname when '机号' then fsnumber else '' end)
from 表1 group by fsid,fsmachname,fsdate
txlicenhe 2003-11-13
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2440/2440306.xml?temp=.6941645
[交流]行列转换

22,297

社区成员

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

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