#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.