繁体   English   中英

使用 case-then 遍历多列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM