ПОЛНОЕ ОБЪЕДИНЕНИЕ в одной таблице в SQL

#sql #join #union

Вопрос:

Я новичок в sql и действительно нуждаюсь в вашей помощи. У меня есть такая таблица, как эти необработанные данные, и на выходе есть столбец с именем Сценарий, я хочу перенести значение столбца I(Май) из строки 7-10 Сценария = Fcst в новый столбец и назвать его FcstMay. Поэтому мой вывод должен выглядеть так, как в строке 13-18, и я отметил сценарий = FvA

Набор данных очень большой, он может достигать 100 тыс. строк, я думал использовать UNION, но это может увеличить мои данные.

Буду очень признателен, если вы поможете мне или решите, как работать с этой таблицей. Пример на https://www.db-fiddle.com/f/vDB2wfwyxkcUHGJPvpmgmt/2

Государство Col1 Col2 Сценарий янв. ФЕВРАЛЬ мар апр Май
Калифорния T Tcost Действие $51.00 $58.00 $42.00 $39.00 $41.00
Калифорния cr cr Действие $95.00 $31.00 $40.00 $26.00 $37.00
Калифорния TCDP осо Действие $45.00 $58.00 $30.00 $28.00 $23.00
Калифорния Доход Доход Действие $13.00 $50.00 $65.00 $92.00 $84.00
Калифорния T Tcost Fcst $10.00 $72.00 $47.00 $17.00 $67.00
Калифорния cr cr Fcst $57.00 $49.00 $94.00 $12.00 $75.00
Калифорния TCDP осо Fcst $46.00 $13.00 $98.00 $62.00 $84.00
Калифорния Oth Oth Fcst $38.00 $13.00 $23.00 $44.00 $93.00

Комментарии:

1. Не могли бы вы вставить код, который вы использовали до сих пор, это помогло бы понять, в чем проблема.

2. Пожалуйста, не ссылайтесь на изображения в своем вопросе, вставьте данные в свой вопрос в виде редактируемого текста.

3. Привет, Александр, Вот мой код: ВЫБЕРИТЕ штат, col1, col2, «FvA» В КАЧЕСТВЕ сценария, Январь, февраль, Март, Апрель, Май, 0 в качестве первого мая из таблицы, где сценарий в («Действие») объединении все ВЫБЕРИТЕ штат, col1, col2, «FvA» В КАЧЕСТВЕ сценария, 0 , 0 , 0 , 0 , 0 , Может КАК MayFcst из моей таблицы, где сценарий в («Fcst»)

Ответ №1:

Вы можете смоделировать a FULL OUTER JOIN в MySQL, объединив (используя UNION ALL ) a LEFT OUTER JOIN с помощью антисоединения. Это повторяется, но это работает.

При правильных индексах это может быть даже быстро.

Например:

 select a.State, a.Col1, a.Col2, 'FvA' as Scenario,
  a.JAN, a.FEB, a.MAR, a.APR, a.May, b.May as MayFcst
from data a
left join data b on b.Col1 = a.Col1 and b.Scenario = 'Fcst'
where a.Scenario = 'Act'
union all
select b.State, b.Col1, b.Col2, 'FvA',
  null, null, null, null, null, b.May as MayFcst
from data b
left join data a on b.Col1 = a.Col1 and a.Scenario = 'Act'
where b.Scenario = 'Fcst'
and a.Col1 is null
 

Результат:

 State       Col1     Col2     Scenario  JAN     FEB     MAR     APR     May     MayFcst 
----------- -------- -------- --------- ------- ------- ------- ------- ------- ------- 
California  T        Tcost    FvA       $51.00  $58.00  $42.00  $39.00  $41.00  $67.00
California  CR       CR       FvA       $95.00  $31.00  $40.00  $26.00  $37.00  $75.00
California  TCDP     ocos     FvA       $45.00  $58.00  $30.00  $28.00  $23.00  $84.00
California  Revenue  Revenue  FvA       $13.00  $50.00  $65.00  $92.00  $84.00  null  
California  Oth      Oth      FvA       null    null    null    null    null    $93.00
 

См.Пример выполнения в DB Fiddle.