使用多个 case 语句合并来自查询的数据
Consolidating data from query with multiple case statements
我在数据库中有一些数据格式如下:
我编写了以下 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
此查询 returns 结果如下:
这不是很有用,我想像这样合并这些数据:
我该如何解决这个问题?谢谢!
我认为您需要条件聚合,措辞如下:
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
中的列别名。如果是这样,逻辑可以简化一点。
我在数据库中有一些数据格式如下:
我编写了以下 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
此查询 returns 结果如下:
这不是很有用,我想像这样合并这些数据:
我该如何解决这个问题?谢谢!
我认为您需要条件聚合,措辞如下:
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
中的列别名。如果是这样,逻辑可以简化一点。