设备表a设备id 设备名
001 A1
002 A2
003 A3参数表b
参数id 参数名
100 额定容量(高)
101 额定容量(中)
102 额定容量(低)
103 参数
设备参数值c
参数id 设备id 参数值
100 A1 500
101 A1 500
102 A1 20
103 A1
100 A2 500
101 A2
102 A2
103 A2 iso
100 A3 500
101 A3
102 A3 20
103 A3 eds要得到的结果
设备id 设备名 额定容量(高) 额定容量(中) 额定容量(低) 参数
001 A1 500 500 20
002 A2 500 iso
003 A3 500 20 eds
哪位老大给点希望吧! 郁闷死了 建视图建表都可以 只要能最后得到那个结果 最好是sql语句一举解决, 急死我了!
001 A1
002 A2
003 A3参数表b
参数id 参数名
100 额定容量(高)
101 额定容量(中)
102 额定容量(低)
103 参数
设备参数值c
参数id 设备id 参数值
100 A1 500
101 A1 500
102 A1 20
103 A1
100 A2 500
101 A2
102 A2
103 A2 iso
100 A3 500
101 A3
102 A3 20
103 A3 eds要得到的结果
设备id 设备名 额定容量(高) 额定容量(中) 额定容量(低) 参数
001 A1 500 500 20
002 A2 500 iso
003 A3 500 20 eds
哪位老大给点希望吧! 郁闷死了 建视图建表都可以 只要能最后得到那个结果 最好是sql语句一举解决, 急死我了!
你搜索一下行列转换,会找到答案的。
设备表a 为 sa
----------------------
设备id 为 id
设备名 为 name
-----------------------
设备参数值c 为 sc
参数id 为 pid
设备id 为 name
参数值 为 pa
-------------------
假设参数表b为固定的:这个SQL就可得你要的
select distinct z.id 设备id, a.name 设备名, b.pa 额定容量_高,c.pa 额定容量_中,d.pa 额定容量_低,e.pa 参数 from sa z, sc a,sc b,sc c,sc d,sc e
where z.name=a.name and
a.name=b.name and b.name=c.name and c.name=d.name and d.name=e.name
and b.pid='100' and c.pid='101' and d.pid='102' and e.pid='103'
--创建测试表
create table 设备表a(设备id varchar(20), 设备名 varchar(20))
insert into 设备表a select '001', 'A1'
union select '002', 'A2'
union select '003', 'A3'
go
----------------------------------------------------------
create table 参数表b(参数id int ,参数名 varchar(20))
insert into 参数表b select 100, '额定容量(高)'
union select 101, '额定容量(中)'
union select 102, '额定容量(低)'
union select 103, '参数'
go
-----------------------------------------------------------create table 设备参数值c(参数id int, 设备id varchar(20), 参数值 varchar(20))
insert into 设备参数值c select 100, '001', '500'
union select 101, '001', '500'
union select 102, '001', '20'
union select 103, '001', ''
union select 100, '002', '500'
union select 101, '002', ''
union select 102, '002', ''
union select 103, '002', 'iso'
union select 100, '003', '500'
union select 101, '003', ''
union select 102, '003', '20'
union select 103, '003', 'eds'
go--动态生成查询
declare @s varchar(8000)
select @s='select c.设备id,max(设备名)[设备名]'
select @s=@s+',max(case c.参数id when '+convert(varchar(20),参数id)+ ' then 参数值 else '''' end) ['+参数名+']' from
(select distinct c.参数id,参数名 from 设备参数值c c inner join 参数表b b on c.参数id=b.参数id ) d order by 参数id
select @s=@s+'from 设备参数值c c inner join 参数表b b on c.参数id=b.参数id
inner join 设备表a a on c.设备id=a.设备id group by c.设备id'
exec( @s)/*结果
设备id 设备名 额定容量(高) 额定容量(中) 额定容量(低) 参数
-------------------- -------------------- -------------------- -------------------- -------------------- --------------------
001 A1 500 500 20
002 A2 500 iso
003 A3 500 20 eds
*/
drop table 设备参数值c
go
drop table 参数表b
go
drop table 设备表a
设备id,设备名,max(额定容量高),max(额定容量中),max(额定容量低),max(参数)
from
(
select
设备id,
设备名,
(case when 参数id='100' then 参数值 else '' end) as 额定容量高,
(case when 参数id='101' then 参数值 else '' end) as 额定容量中,
(case when 参数id='102' then 参数值 else '' end) as 额定容量低,
(case when 参数id='103' then 参数值 else '' end) as 参数
from
(select a.设备id,a.设备名,c.参数id,c.参数值
from a,c
where a.设备名 = c.设备id) as tmp1(设备id,设备名,参数id,参数值)
) as tmp2
group by 设备id,设备名
参数id 参数名
100 额定容量(高)
101 额定容量(中)
102 额定容量(低)
103 参数转换成(横排列)100 101 102 103
如果有这样的函数,这个就特别好写