Как я могу транспонировать результат запроса в SQL? - PullRequest
0 голосов
/ 03 июля 2019

В результате многих подзапросов у меня есть следующая таблица:

+---------------------------------------------+
| register | simulation | hasLimit | approved |
+---------------------------------------------+
|     X    |     Y      |    Z     |    W     |
+---------------------------------------------+

Но я хочу, чтобы это было так:

+----------------+
| register   | X | 
+----------------+
| simulation | Y | 
+----------------+
| hasLimit   | Z | 
+----------------+
| approved   | W | 
+----------------+

В RI просто перенести с помощьюФункция t (), однако в SQL это выглядит немного сложнее.Я пытался понять функцию pivot, применяемую в этом случае, но это кажется немного странным, так как на самом деле я просто перемещаю, а не поворачиваю что-либо.

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Учитывая возврат от

         SELECT 'x' AS register
              , 'y' AS simulation
              , 'z' AS hasLimit
              , 'w' AS approved

Мы можем заключить это в набор символов и ссылаться на него как на встроенное представление во внешнем запросе.

Например:

SELECT CASE i.n
         WHEN 1 THEN 'register'
         WHEN 2 THEN 'simulation'
         WHEN 3 THEN 'hasLimit'
         WHEN 4 THEN 'approved'
       END AS col1
     , CASE i.n
         WHEN 1 THEN q.register
         WHEN 2 THEN q.simulation
         WHEN 3 THEN q.hasLimit
         WHEN 4 THEN q.approved
       END AS col2
  FROM (
         SELECT 'x' AS register
              , 'y' AS simulation
              , 'z' AS hasLimit
              , 'w' AS approved
       ) q
 CROSS
  JOIN ( SELECT 1 AS n
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
       ) i
 ORDER
    BY i.n

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

SELECT 'register'  AS col1, ( scalar_subquery_for_x ) AS col2
UNION ALL 
SELECT 'simulation'       , ( scalar_subquery_for_y )
UNION ALL 
SELECT 'hasLimit'         , ( scalar_subquery_for_z )
UNION ALL 
SELECT 'approved'         , ( scalar_subquery_for_w )

ЕСЛИ нам нужен гарантированный заказ, мы можем обернуть все это в скобки и добавить предложение ORDER BY. (Без ORDER BY мы наблюдаем, что строки возвращаются «по порядку» из UNION ALL, но такое поведение не гарантируется.)

0 голосов
/ 04 июля 2019

Используйте простой UNPIVOT, как показано ниже,

SELECT Col, Val
FROM <Your Table>
UNPIVOT (Val FOR Col IN([register],[simulation],[hasLimit],[approved])) unpiv
0 голосов
/ 03 июля 2019

Вы, похоже, хотите выполнить операцию "unpivot".

Если все типы столбцов совместимы, вы можете использовать union all:

select 'register' as which, register as value union all
select 'simulation',  simulation union all
select 'hasLimit', hasLimit union all
select 'approved', approved;

В некоторых базах данных для каждого подзапроса требуется условие FROM, например from dual.

Это очень маленький объем данных. Для больших данных я предпочитаю боковое соединение, но синтаксис (и доступность которого) зависит от базы данных.

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