#sql #pivot #union #impala #unpivot
#sql #поворот #объединение #impala #отменить
Вопрос:
Я делаю свой первый набег на что-то правильное в SQL, за исключением проблем с репликацией чего-то, что я легко смог сделать через Alteryx.
По сути, некоторые базовые данные, необходимые для создания сводки таблицы, которую я уже создал в Impala / Hive. Базовую таблицу необходимо разбить на более мелкие таблицы (не сводные и сводные), которые затем объединяются вместе для создания агрегированной таблицы.
Таблица выглядит следующим образом:
Run_Code | ID | ColB | ColC | ColD | ColE | ColF | ColG | TaxExpense | RetainedExpense | IncomeExpense | Year
-----------------------------------------------------------------------------------------------------------------
run1 | 21 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234.56789 | 1234.56789 | 1234.56789 | Year1
run1 | 22 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234.56789 | 1234.56789 | 1234.56789 | Year2
run1 | 23 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234.56789 | 1234.56789 | 1234.56789 | Year3
run1 | 24 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234.56789 | 1234.56789 | 1234.56789 | Year4
В настоящее время в Alteryx выполняется следующее; при этом выбирается только TaxExpense, а затем отменяется поворот на год, а затем снова поворачивается в виде столбца.
Run_Code | ID | ColB | ColC | ColD | Name | Year1 | Year2 | Year3 | Year4
-----------------------------------------------------------------------------------------------------------------
run1 | 21 | 1234 | 1234 | 1234 | Tax Expense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | Tax Expense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | Tax Expense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | Tax Expense | (sum) | (sum) | (sum) | (sum)
То же самое делается для сохраненных расходов, а затем и для IncomeExpense.
Run_Code | ID | ColB | ColC | ColD | Name | Year1 | Year2 | Year3 | Year4
-----------------------------------------------------------------------------------------------------------------
run1 | 21 | 1234 | 1234 | 1234 | RetainedExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | RetainedExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | RetainedExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | RetainedExpense | (sum) | (sum) | (sum) | (sum)
Конечный результат — это то, что ниже, а желаемое — это то, что ниже:
Run_Code | ID | ColB | ColC | ColD | Name | Year1 | Year2 | Year3 | Year4
-----------------------------------------------------------------------------------------------------------------
run1 | 21 | 1234 | 1234 | 1234 | TaxExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | TaxExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | TaxExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | TaxExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | RetainedExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | RetainedExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | RetainedExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | RetainedExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | IncomeExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | IncomeExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | IncomeExpense | (sum) | (sum) | (sum) | (sum)
run1 | 21 | 1234 | 1234 | 1234 | IncomeExpense | (sum) | (sum) | (sum) | (sum)
Ценю любую помощь в создании SQL, который решает вышеуказанное.
Ответ №1:
Хммм … Если я правильно понимаю, вы можете отключить и повторно сгруппировать:
select Run_Code, ID, ColB, ColC, ColD,
sum(case when year = 'year1' then expense end) as year_1,
sum(case when year = 'year2' then expense end) as year_2,
sum(case when year = 'year3' then expense end) as year_3,
sum(case when year = 'year4' then expense end) as year_4
from ((select Run_Code, ID, ColB, ColC, ColD, 'TaxExpense' as name, TaxExpense as expense, year
from t
) union all
(select Run_Code, ID, ColB, ColC, ColD, 'RetainedExpense' as name, RetainedExpense, year
from t
) union all
(select Run_Code, ID, ColB, ColC, ColD, 'IncomeExpense' as name, IncomeExpense, year
from t
)
) t
group by Run_Code, ID, ColB, ColC, ColD, name
Комментарии:
1. Я получаю следующую ошибку: Исключение AnalysisException: для SUM требуется числовой параметр: sum (СЛУЧАЙ, КОГДА year = ‘YEAR1’ ЗАТЕМ Name END). Когда я пытаюсь использовать MAX вместо Sum, поле Name не отображается, и вместо этого они заполняются годами Year_1, Year_2 и т. Д.