Oracle SQL запрос выводится путем транспонирования строк в столбцы - PullRequest
0 голосов
/ 05 октября 2018

У меня есть таблица базы данных оракула '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  

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Вы можете присоединиться к столу самостоятельно.

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'
0 голосов
/ 06 октября 2018

Это можно сделать с помощью следующего запроса, если для имени есть только два допустимых значения.

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;

Для большего количества значений используйте более хитрый PIVOT:

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
)
0 голосов
/ 05 октября 2018

Вы можете использовать условное агрегирование:

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_tv и name_cb?Они кажутся излишними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...