这样的表结构转换?困扰了我很久了~~~~~~~~~~~~~~~~~~~

cmxstudio 2006-12-20 02:29:46
原始结构如下:
ID 名称 属性 值
1 面包 保质期 1个月
1 面包 出产日期 2005.01.01
2 矿泉水 保质期 6个月
2 矿泉水 出产日期 2006.05.06
...

转换后结构如下
ID 名称 保质期 出产日期
1 面包 1个月 2005.01.01
2 矿泉水 6个月 2006.05.06


----------------------------------------------------------
这该如何转换呢?
...全文
249 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
子陌红尘 2006-12-20
  • 打赏
  • 举报
回复
create table test(ID int,名称 varchar(10),属性 varchar(10),值 varchar(10))
insert into test select 1,'面包 ','保质期 ','1个月 '
insert into test select 1,'面包 ','出产日期','2005.01.01'
insert into test select 2,'矿泉水','保质期 ','6个月 '
insert into test select 2,'矿泉水','出产日期','2006.05.06'
go

declare @sql varchar(8000)
set @sql =''

select @sql=@sql+',['+属性+']=max(case when 属性='''+属性+''' then 值 else null end) '
from test group by 属性

set @sql='select ID,名称'+@sql+' from test group by id,名称'

exec(@sql)
go

/*
ID 名称 保质期 出产日期
----------- ---------- ---------- ----------
2 矿泉水 6个月 2006.05.06
1 面包 1个月 2005.01.01
*/


drop table test
go
jacobsan 2006-12-20
  • 打赏
  • 举报
回复
上面那个漏了set @sql =''初始化
jacobsan 2006-12-20
  • 打赏
  • 举报
回复
create table #t (ID int,名称 varchar(10),属性 varchar(10),值 varchar(10))
insert into #t select 1,'面包 ','保质期 ','1个月 '
insert into #t select 1,'面包 ','出产日期','2005.01.01'
insert into #t select 2,'矿泉水','保质期 ','6个月 '
insert into #t select 2,'矿泉水','出产日期','2006.05.06'

declare @sql varchar(8000)
set @sql =''
select @sql=@sql+',max(case when 属性='''+属性+''' then 值 else null end) as '+属性 from #t group by 属性

print @sql
exec('select ID,min(名称)'+@sql+' from #t group by id')



------
1 面包 1个月 2005.01.01
2 矿泉水 6个月 2006.05.06
jacobsan 2006-12-20
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
select @sql=@sql+',max(case when 属性='''+属性+''' then 值 else null end) as '+属性 from 表 group by 属性
exec('select ID,min(名称)'+@sql+' from 表 group by id')
cmxstudio 2006-12-20
  • 打赏
  • 举报
回复
楼上能举个例子吗?
jacobsan 2006-12-20
  • 打赏
  • 举报
回复
用动态sql
cmxstudio 2006-12-20
  • 打赏
  • 举报
回复
谢谢几位帮忙,但是我这个第一个表只是举了两个属性的例子,实际上属性的个数是不定的,比如还有出产厂商等,这该如何解决呢?
hanker1314520 2006-12-20
  • 打赏
  • 举报
回复
select ID,名称,Max(case when 属性 = 保质期 then 值 else '' end),Max(case when 属性 = 出产日期 then 值 else '' end)
from Table group by ID,名称
没有测试过,不知道得不得
子陌红尘 2006-12-20
  • 打赏
  • 举报
回复
declare @t table(ID int,名称 varchar(10),属性 varchar(10),值 varchar(10))
insert into @t select 1,'面包 ','保质期 ','1个月 '
insert into @t select 1,'面包 ','出产日期','2005.01.01'
insert into @t select 2,'矿泉水','保质期 ','6个月 '
insert into @t select 2,'矿泉水','出产日期','2006.05.06'

select
ID,名称,
max(case 属性 when '保质期' then 值 end) as 保质期,
max(case 属性 when '出产日期' then 值 end) as 出产日期
from
@t
group by
ID,名称

/*
ID 名称 保质期 出产日期
----------- ---------- ---------- ----------
2 矿泉水 6个月 2006.05.06
1 面包 1个月 2005.01.01
*/
jacobsan 2006-12-20
  • 打赏
  • 举报
回复
select ID,min(名称),max(case when 属性='保质期' then 值 else null end) as 保质期,max(case when 属性='出产日期' then 值 else null end) as 出产日期 from 表 group by id
子陌红尘 2006-12-20
  • 打赏
  • 举报
回复
select
ID,名称,
max(case 属性 when '保质期' then 值 end) as 保质期,
max(case 属性 when '出产日期' then 值 end) as 出产日期
from

group by
ID,名称

22,209

社区成员

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

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