通过将行转换为列来实现Oracle SQL查询输出

通过将行转换为列来实现Oracle SQL查询输出,sql,oracle,Sql,Oracle,我有一个oracle数据库表“App”,其中很少有示例行,如下所示- ID NAME SN 123 TV 032361097 123 CB G92970256 236 TV 050791069 345 CB 45681089 456 TV 456 CB 我希望通过将行转换为列来获得以下格式的输出- ID NAME_TV SR_TV NAME_CB SR_CB 123 TV 032361097 CB G

我有一个oracle数据库表“App”,其中很少有示例行,如下所示-

ID  NAME    SN
123 TV      032361097
123 CB      G92970256
236 TV      050791069
345 CB      45681089
456 TV  
456 CB  
我希望通过将行转换为列来获得以下格式的输出-

ID  NAME_TV SR_TV       NAME_CB SR_CB
123 TV      032361097   CB      G92970256
236 TV      050791069       
345                     CB      45681089
456 TV                  CB  

您可以使用条件聚合:

select id, 'TV' as name_tv, sum(case when name = 'TV' then sn end) as sn_tv,
        'CB' as name_cb, sum(case when name = 'CB' then sn end) as sn_cb
from app
group by id;

我确实有一个问题:为什么有
name\u tv
name\u cb
列?它们似乎是多余的。

您可以使用条件聚合:

select id, 'TV' as name_tv, sum(case when name = 'TV' then sn end) as sn_tv,
        'CB' as name_cb, sum(case when name = 'CB' then sn end) as sn_cb
from app
group by id;

我确实有一个问题:为什么有
name\u tv
name\u cb
列?它们似乎是多余的。

你可以自己加入表格

select tv.id,
        tv.name as name_tv, 
        tv.sn as sr_tv, 
        cb.name as name_cb,
        cb.sn as sr_cb   
from app tv
join app cb
on tv.id = cb.id
where tv.name = 'TV'
and cb.name = 'CB'

你可以自己加入这个桌子

select tv.id,
        tv.name as name_tv, 
        tv.sn as sr_tv, 
        cb.name as name_cb,
        cb.sn as sr_cb   
from app tv
join app cb
on tv.id = cb.id
where tv.name = 'TV'
and cb.name = 'CB'

如果name只有两个有效值,则可以通过以下查询完成

WITH
  tv as (select id, name, sn from app where name = 'TV'),
  cb as (select id, name, sn from app where name = 'CB')
SELECT 
  nvl(tv.id, cb.id) AS id,
  tv.name           AS name_tv,
  tv.sn             AS sn_tv,
  cb.name           AS name_cb,
  cb.sn             AS sn_cb
FROM tv
  FULL OUTER JOIN cb
    ON tv.id = cb.id;
要获得更多值,请使用更复杂的轴:

SELECT * FROM (
  SELECT id, name, sn
  FROM app
) PIVOT (
  MAX(name) as name, MAX(sn) as sn
  FOR name IN ('TV' as TV, 'CB' as CB) --put other name values there
)

如果name只有两个有效值,则可以通过以下查询完成

WITH
  tv as (select id, name, sn from app where name = 'TV'),
  cb as (select id, name, sn from app where name = 'CB')
SELECT 
  nvl(tv.id, cb.id) AS id,
  tv.name           AS name_tv,
  tv.sn             AS sn_tv,
  cb.name           AS name_cb,
  cb.sn             AS sn_cb
FROM tv
  FULL OUTER JOIN cb
    ON tv.id = cb.id;
要获得更多值,请使用更复杂的轴:

SELECT * FROM (
  SELECT id, name, sn
  FROM app
) PIVOT (
  MAX(name) as name, MAX(sn) as sn
  FOR name IN ('TV' as TV, 'CB' as CB) --put other name values there
)