Oracle SQL - транспонирование столбцов в виде строк с сохранением одного столбца - PullRequest
0 голосов
/ 10 октября 2019

У меня есть следующая таблица (это действительно представление, основанное на сложной логике):

|    TYPE | FIELD1 | FIELD2 | FIELD3 | FIELDNEEDSTOSTAYASCOLUMN |
|---------|--------|--------|--------|--------------------------|
|     bad |      1 |      1 |      1 |                     1000 |
| neutral |      2 |      2 |      2 |                     1000 |
|    good |      3 |      3 |      3 |                     1000 |

Мне нужно повернуть его к приведенному ниже. Возьмите все столбцы и переместите их как строки, но мне нужно сохранить последний столбец.

|   FIELD | BAD    | NEUTRAL| GOOD   | FIELDNEEDSTOSTAYASCOLUMN |
|---------|--------|--------|--------|--------------------------|
| FIELD1  |      1 |      1 |      1 |                     1000 |
| FIELD2  |      2 |      2 |      2 |                     1000 |
| FIELD3  |      3 |      3 |      3 |                     1000 |

Я пытался использовать ORacl'es PIVOT и UNPIVOT, но не смог создать это.

Это скрипка sql:

http://sqlfiddle.com/#!4/8fb63/10

Ответы [ 2 ]

2 голосов
/ 10 октября 2019
select  field, bad, neutral, good, fieldneedstostayascolumn
from    mytable
unpivot (val for (field, ord) in (field1 as ('FIELD1', 1), field2 as ('FIELD2', 2),
                                  field3 as ('FIELD3', 3)))
pivot   (min(val) for type in ('bad' as bad, 'neutral' as neutral, 'good' as good))
order   by ord
;



FIELD   BAD NEUTRAL GOOD FIELDNEEDSTOSTAYASCOLUMN
------ ---- ------- ---- ------------------------
FIELD1    1       2    3                     1000
FIELD2    1       2    3                     1000
FIELD3    1       2    3                     1000
2 голосов
/ 10 октября 2019

Вот, пожалуйста,

WITH T1 AS (SELECT
   PROPERTY AS FIELD,
   TYPE,

   VALUE as VAL,
            FIELDNEEDSTOSTAYASCOLUMN
FROM
   MYTABLE
UNPIVOT
EXCLUDE NULLS
(
   VALUE
   FOR
      PROPERTY
   IN
   (
      FIELD1,
      FIELD2,
     FIELD3
   )
))
SELECT * FROM T1
PIVOT
(
   max(VAL)
   FOR
      (TYPE)
   IN
      ('bad','neutral','good')
)
order by FIELD;

Кстати, ваши результаты не верны.

http://sqlfiddle.com/#!4/8fb63/30/0

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