Консолидация данных из запроса с несколькими инструкциями - PullRequest
1 голос
/ 03 июля 2019

У меня есть некоторые данные в базе данных, отформатированные следующим образом: Database design

Я написал следующий запрос SQL для извлечения данных из этой базы данных.Вот запрос, который у меня пока есть:

select network, 
MAX(CASE WHEN channel = 'R' and brand ='B' and spec_ind = 'x' and extended_day_ind = 'y' then 'RB30'
WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and extended_day_ind = 'Y' then 'RG90'
WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and extended_day_ind = 'N' then 'RB30'
WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and extended_day_ind = 'N' then 'RG30' END) as Channel,
case header
    when 'Annual Shift' then value_vl end as AnnualShift,
Case header
    when 'Min' then value_vl end as MinVal,
Case Header
    when 'Max' then value_vl end as MaxVal
From mytable
WHERE network <> 'x'
group by network, value_vl, header
order by network asc

Этот запрос возвращает результаты в следующем виде:

return

Это не такочень полезно, и я хотел бы объединить эти данные следующим образом:

how I want it

Как мне исправить это?Спасибо!

1 Ответ

1 голос
/ 03 июля 2019

Я думаю, вы хотите условное агрегирование, сформулированное так:

select network, 
       (CASE WHEN channel = 'R' and brand ='B' and spec_ind = 'x' and extended_day_ind = 'y' then 'RB30'
                WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and extended_day_ind = 'Y' then 'RG90'
                WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and 
                     extended_day_ind = 'N' then 'RB30'
                WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and extended_day_ind = 'N' then 'RG30'
        END) as Channel,
       MAX(case header when 'Annual Shift' then value_vl end) as AnnualShift,
       MAX(Case header when 'Min' then value_vl end) as MinVal,
       MAX(Case Header  when 'Max' then value_vl end) as MaxVal
From FIN_SANDBOX.asm_paid_rates_range
WHERE network <> 'x'
group by network, 
         (CASE WHEN channel = 'R' and brand ='B' and spec_ind = 'x' and extended_day_ind = 'y' then 'RB30'
              WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and extended_day_ind = 'Y' then 'RG90'
              WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and 
                   extended_day_ind = 'N' then 'RB30'
              WHEN channel = 'R' and brand ='G' and spec_ind = 'x' and extended_day_ind = 'N' then 'RG30'
          END)
order by network asc;

Я не помню, допускает ли Teradata псевдонимы столбцов в GROUP BY.Если это так, то логика может быть немного упрощена.

...