通过将行转换为列来实现Oracle SQL查询输出
我有一个oracle数据库表“App”,其中很少有示例行,如下所示-通过将行转换为列来实现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
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
)