MySql (Аврора) проблемы с транспонированием (обнуление) - PullRequest
0 голосов
/ 26 мая 2020

У меня есть такая таблица в MySQL (Aurora):

A    B    C
1   100   60
1   102   40

Моя конечная цель - транспонировать это и сделать так, чтобы он выглядел так:

A   B_1   C_1   B_2   C_2
1   100   60    102    40

My запрос:

SELECT Table.A,
MAX(Table.B) AS `B_1`,
(CASE WHEN Table.B = MAX(Table.B) then Table.C END) AS `C_1`,
MIN(Table.B) AS `B_2`,
(CASE WHEN Table.B = MIN(Table.B) THEN Table.C END) AS `C_2` 
FROM
TABLE 
GROUP BY Table.A

Но я получаю следующие результаты:

A   B_1   C_1   B_2   C_2
1   100   null  102    40

Может ли кто-нибудь помочь мне исправить эту нулевую проблему?

1 Ответ

0 голосов
/ 26 мая 2020

Исходя из результата, похоже, вы хотите, чтобы значение B_1 было min(B), а C_1 было соответствующим значением C из той же строки. Аналогично, значение B_2 должно быть max(B), а C_2 - соответствующим значением C из той же строки.

В вашем запросе у вас есть обычные столбцы, появляющиеся в SELECT, без их включения в GROUP BY. Это приведет к ошибке в новой версии MySQL (и во всех других базах данных).

Вы можете сначала вычислить MIN(B) и MAX(B), а затем снова объединить результат с таблицей, чтобы получить C столбцы.

select minb as 'B_1',
       max(c1) as 'C_1',
       maxb as 'B_2',
       min(c2) as 'C_2'
from (
  select 
    s.minb, 
    if (s.minb=m.B, m.C, null) as c1,
    s.maxb, 
    if (s.maxb=m.B, m.C, null) as c2
  from test m
    join (
      select A,
        min(B) as `minb`,
        max(B) AS `maxb`
      from test
      group by A
    ) as s on s.A=m.A
  ) as q
group by minb, maxb

См. dbfiddle

...