Внешнее объединение или объединение всех для преобразования строк в столбцы - PullRequest
0 голосов
/ 02 июля 2019

Что у меня есть: стол

 _______________________________________            
 | MachUUID | State|  Pass   | Fail    |   
 |--------------------------------------
 |  1234    | A    |   0.2   |    0.98 |  
 |  1234    | B    |   0.5   |    0.5  |  
 |  1234    | C    |   0.8   |    0.2  |
 ---------------------------------------

Что я хочу : transformed_table

 | MachUUID | A_Pass | A_Fail | B_Pass | B_Fail | C_Pass | C_Fail
  --------------------------------------------------------------
 |  1234    |  0.2   | 0.98   |  0.5   |  0.5   | 0.8    |  0.2 

Количество состояний (A, B и т. Д. Фиксировано). На данный момент их до 20. Таким образом, чтобы преобразовать это

Что я делаю :

Transformed_Table AS (
SELECT MachUUID, Pass AS A_Pass, Fail AS A_Fail
FROM table
WHERE State = 'A'
UNION ALL

SELECT MachUUID, Pass AS B_Pass, Fail AS B_Fail
FROM table
WHERE State = 'B'
UNION ALL

SELECT MachUUID, Pass AS C_Pass, Fail AS C_Fail
FROM table
WHERE State = 'C')

Однако, это возвращает странный союз, который выглядит примерно так:

Я получаю ошибочный вывод

| MachUUID | A_Pass| A_Fail |
|   1234   | 0.2   | 0.98   |
|   1234   | 0.5   | 0.5    |
|   1234   | 0.8   | 0.2    |

Вопрос

Я думаю, что мое понимание единства на данном этапе неверно. Я понимаю внешние соединения и мне интересно, если это лучший способ сделать это.

Я открыт для предложений о других способах решения этой проблемы

1 Ответ

2 голосов
/ 02 июля 2019

Вы можете сделать это с помощью условного агрегирования:

select MachUUID,
       max(case when state = 'A' then pass end) as a_pass,
       max(case when state = 'A' then fail end) as a_fail,
       max(case when state = 'B' then pass end) as b_pass,
       max(case when state = 'B' then fail end) as b_fail,
       max(case when state = 'C' then pass end) as c_pass,
       max(case when state = 'C' then fail end) as c_fail
from t
group by MachUUID
...