设备表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语句一举解决, 急死我了!

解决方案 »

  1.   

    这个要对sql语句动态的拼凑,
    你搜索一下行列转换,会找到答案的。
      

  2.   

    sum(),case---when group by ok le
      

  3.   

    我觉得这样的变法需要用程序来实现,直接用SQL做,我觉得做不出来
      

  4.   

    简化一下:
    设备表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'
      

  5.   

    交叉表,如果你参数表b中就只有固定的那四个值会比较好做些,就可以在SQL中写死
      

  6.   

    --你的设备参数值c表的设备id应该存id 而不是名称,我改了
    --创建测试表
    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
      

  7.   

    select 
    设备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,设备名
      

  8.   

    这个语句的重点其实就在于,能否把参数表b(纵排列)
    参数id   参数名
    100       额定容量(高)
    101       额定容量(中)
    102       额定容量(低)
    103       参数转换成(横排列)100    101    102    103
    如果有这样的函数,这个就特别好写
      

  9.   

    感谢各位的大力协助 嘿嘿 最后用了小虾米大哥的办法  虽然MAX无法判断出首位是空的数据但是还是很感激