[英]Loop through multiple columns with case-then
我正在使用 oracle sql 开发人员并有一个查询,我想在不同的列上应用相同的查询,然后将结果 output 堆叠到一个 data.table 中。
例如,查询如下所示:
select BG_TURNOVER, MARKET, count(*)
FROM( SELECT (CASE
WHEN sports_returns_l90d = 0
THEN 'sports_returns_l90d_0'
WHEN sports_returns_l90d > 0 AND sports_returns_l90d <= 500
THEN 'sports_returns_l90d_0_500'
WHEN sports_returns_l90d > 500 AND sports_returns_l90d <= 1000
THEN 'sports_returns_l90d_500_1000'
WHEN sports_returns_l90d > 1000 AND sports_returns_l90d <= 2500
THEN 'sports_returns_l90d_1000_2500'
WHEN sports_returns_l90d > 2500 AND sports_returns_l90d <= 5000
THEN 'sports_returns_l90d_2500_5000'
ELSE 'sports_returns_l90d_5000+'
END) AS BG_TURNOVER, MARKET
FROM PRODUCT_TABLE ) group by BG_TURNOVER, MARKET;
看起来像:
BG_TURNOVER MARKET count
sports_returns_l90d_5000+ Romania 497864
sports_returns_l90d_1000_2500 Hungary 2986
sports_returns_l90d_0 Belgium Dutch 14103
sports_returns_l90d_5000+ Intl French 6745
...
但是,我想应用多个列来代替sports_returns_l90d
。 然后让字符串匹配该列名。
例如:
select BG_TURNOVER, MARKET, count(*)
FROM( SELECT (CASE
WHEN X = 0
THEN 'X_0'
WHEN X > 0 AND X <= 500
THEN 'X_0_500'
WHEN X > 500 AND X <= 1000
THEN 'X_500_1000'
WHEN X > 1000 AND X <= 2500
THEN 'X_1000_2500'
WHEN X > 2500 AND X <= 5000
THEN 'X_2500_5000'
ELSE 'X_5000+'
END) AS BG_TURNOVER, MARKET
FROM PRODUCT_TABLE ) group by BG_TURNOVER, MARKET;
其中 X 采用列名: sports_return_l90d, sports_returns, bingo_returns
,有没有办法迭代所有这些?
如果您在不同的列中有sports_return_l90d, sports_returns, bingo_returns
值,例如:
CREATE TABLE product_table ( sports_return_l90d, sports_returns, bingo_returns, market ) AS
SELECT 1000, 5500, 1, 'AAA' FROM DUAL CONNECT BY LEVEL <= 10;
然后你可以使用:
SELECT type ||
CASE
WHEN bg_turnover = 0
THEN '_0'
WHEN bg_turnover > 0 AND bg_turnover <= 500
THEN '_0_500'
WHEN bg_turnover > 500 AND bg_turnover <= 1000
THEN '_500_1000'
WHEN bg_turnover > 1000 AND bg_turnover <= 2500
THEN '_1000_2500'
WHEN bg_turnover > 2500 AND bg_turnover <= 5000
THEN '_2500_5000'
ELSE '_5000+'
END AS BG_TURNOVER,
MARKET,
count(*)
FROM PRODUCT_TABLE
UNPIVOT (
bg_turnover FOR type IN (
sports_return_l90d AS 'sports_return_l90d',
sports_returns AS 'sports_returns',
bingo_returns AS 'bingo_returns'
)
)
GROUP BY
type,
CASE
WHEN bg_turnover = 0
THEN '_0'
WHEN bg_turnover > 0 AND bg_turnover <= 500
THEN '_0_500'
WHEN bg_turnover > 500 AND bg_turnover <= 1000
THEN '_500_1000'
WHEN bg_turnover > 1000 AND bg_turnover <= 2500
THEN '_1000_2500'
WHEN bg_turnover > 2500 AND bg_turnover <= 5000
THEN '_2500_5000'
ELSE '_5000+'
END,
MARKET;
哪些输出:
BG_营业额 | 市场 | 数数(*) |
---|---|---|
sports_return_l90d_500_1000 | AAA级 | 10 |
sports_returns_5000+ | AAA级 | 10 |
bingo_returns_0_500 | AAA级 | 10 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.