@iskateli

Как задать столбцы для транспонирования только средствами SQL?

Как перевернуть строки в столбцы только средствами SQL (не PL/SQL) , но мне не нужны все столбцы, а только определённые, сами названия столбцов я могу получить подзапросом, но в pivot например нельзя использовать подзапрос.

Итак вот что я сам выяснил, есть следующие способы получения сводной таблицы:

Использовать подзапросы прямо в Select
Использовать DECODE или CASE
Использовать функцию PIVOT

Во всех случаях что я видел надо вручную указывать названия столбцов, можно ли как то этого избежать и формировать названия только заданные подзапросом? Без явного перечисления столбцов.

Если так нельзя сделать, то может можно перечислить все столбцы, но как то скрыть нулевые столбцы (в них все значения NULL получаются)?

Разные примеры из списка выше:
подзапросы в Select
SELECT
         object_type, systable.cnt "SYS", systemtable.cnt "SYSTEM", scotttable.cnt "SCOTT"
     FROM
         (SELECT object_type, COUNT(*) cnt from all_objects WHERE owner = 'SYS' GROUP BY object_type) systable
         FULL OUTER JOIN
         (SELECT object_type, COUNT(*) cnt from all_objects WHERE owner = 'SYSTEM' GROUP BY object_type) systemtable USING  (object_type)
         FULL OUTER JOIN
         (SELECT object_type, COUNT(*) cnt from all_objects WHERE owner = 'SCOTT' GROUP BY object_type) scotttable USING (object_type)
     WHERE object_type IN ('TABLE', 'VIEW', 'TRIGGER');

OBJECT_TYPE                 SYS     SYSTEM      SCOTT
-------------------- ---------- ---------- ----------
TRIGGER                      10          2 
TABLE                       998        157          
VIEW                       3865         12


DECODE или CASE
SELECT
         object_type,
         COUNT(DECODE(owner, 'SYS', 1, NULL)) "SYS",
         COUNT(DECODE(owner, 'SYSTEM', 1, NULL)) "SYSTEM",
         COUNT(DECODE(owner, 'SCOTT', 1, NULL)) "SCOTT"
     FROM all_objects
     WHERE object_type IN ('TABLE', 'VIEW', 'TRIGGER')
     GROUP BY object_type;

OBJECT_TYPE                 SYS     SYSTEM      SCOTT
-------------------- ---------- ---------- ----------
TRIGGER                      10          2          0
TABLE                       998        157          0
VIEW                       3865         12          0


функция PIVOT
SELECT *
     FROM (
         SELECT owner, object_type
         FROM all_objects
         WHERE object_type IN ('TABLE', 'VIEW', 'TRIGGER'))
     PIVOT (COUNT(*) FOR owner IN ('SYS', 'SYSTEM', 'SCOTT'));

OBJECT_TYPE               'SYS'   'SYSTEM'    'SCOTT'
-------------------- ---------- ---------- ----------
TRIGGER                      10          2          0
TABLE                       998        157          0
VIEW                       3865         12          0
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы