【问题标题】:Capture the Conditional statement group by Count from case statement oracle sql从case语句oracle sql中按Count捕获条件语句组
【发布时间】:2021-05-01 15:32:37
【问题描述】:

嗨,我正在尝试按组捕获计数,但我需要的分组来自 case 语句中的人工列,我想知道如何实现这一点,下面是我正在使用的 sql 代码,这可以使用 WITH CTE ?还是有任何最简单的方法,下面是查询以及现有结果和预期结果

db - Oracle DB 11g

查询

SELECT DISTINCT
EA.TGT_TBL,
REGEXP_SUBSTR(EA.TGT_TBL, '[0-9]+') AS SYSTEM_ID,
COUNT(*),
ROUND(100*RATIO_TO_REPORT(COUNT(*)) OVER (), 2) PERCENTAGE,
CASE WHEN EA.TGT_TBL LIKE '%DWH_STAGE.%' THEN 'STAGE'
     WHEN EA.TGT_TBL LIKE '%DWH_STAGE_CST.%'THEN 'STAGE'
     WHEN EA.TGT_TBL LIKE 'DEV_DWH.%' THEN 'STAGE'
     WHEN EA.TGT_TBL LIKE 'BI_EDW.%' THEN 'EDW'
     WHEN EA.TGT_TBL LIKE 'DEV_DWH_EDW.%' THEN 'EDW'
     WHEN EA.TGT_TBL LIKE 'BI_EDW_CST.%' THEN 'EDW'
     WHEN EA.TGT_TBL LIKE 'DEV_DWH_EDW_CST.%' THEN 'EDW'
     WHEN EA.TGT_TBL LIKE 'BI_EDW_PREM2.%' THEN 'EDW'
     WHEN EA.TGT_TBL LIKE 'DEV_DWH_EDW.%' THEN 'EDW'
     WHEN EA.TGT_TBL LIKE 'BI_MART.%' THEN 'MART'
     WHEN EA.TGT_TBL LIKE 'DEV_DWH_MART.%' THEN 'MART'
     WHEN EA.TGT_TBL LIKE 'BI_MART_CST.%' THEN 'MART'
     WHEN EA.TGT_TBL LIKE 'DEV_DWH_MART_CST.%' THEN 'MART'
     WHEN EA.TGT_TBL LIKE 'SHP_MART.%' THEN 'MART'
     WHEN EA.TGT_TBL LIKE 'BI_REPO.%' THEN 'REPO'
     WHEN EA.TGT_TBL LIKE 'BI_PMART.%' THEN 'MART'
     WHEN EA.TGT_TBL LIKE 'BI_META.%' THEN 'META'
     WHEN EA.TGT_TBL LIKE 'BI_META_CST.%' THEN 'META'
     WHEN EA.TGT_TBL LIKE 'DEV_DWH_META.%' THEN 'META'
     WHEN EA.TGT_TBL LIKE 'BI_DFL.%' THEN 'DFL'
     WHEN EA.TGT_TBL LIKE 'MPN_ETL_WORK.%' THEN 'VISA'
ELSE 'OTHER'
    END AS SCHEMA_GROUP
FROM BI_ETL_AUD EA
WHERE 1=1
AND TRUNC(EA.SESS_BEG)=TRUNC(SYSDATE)
AND TRUNC(EA.SESS_END)=TRUNC(SYSDATE)
GROUP BY 
EA.TGT_TBL,
REGEXP_SUBSTR(EA.TGT_TBL, '[0-9]+')
ORDER BY 
EA.TGT_TBL,
REGEXP_SUBSTR(EA.TGT_TBL, '[0-9]+'),SYSTEM_ID,SCHEMA_GROUP

现有结果

TGT_TBL         SYSTEM_ID SCHEMA_GROUP COUNT(*) PERCENTAGE
AB_01_SHP_ORDER 01        STAGE        10       0.1
BC_AB_PUR_STTS  null      EDW          200      2
GH_FND_AJD_DAA  null      MART         10       0.1
SD_HS_HHA_DHD   null      REPO         100      1

预期结果

SCHEMA_GROUP COUNT(*) PERCENTAGE
STAGE        500      10
EDW          1500     30
MART         3000     60
REPO         250      05  

 

请注意,我正在尝试从 SCHEMA_GROUP 获取分组(此列不在表中 - CASE 语句中使用的人工列)

【问题讨论】:

  • 使用子查询或 CTE,以便您可以引用别名。
  • 我尝试与 cte 一起使用,但这个人造列 SCHEMA_GROUP 我无法放置 ORA-00904:“SCHEMA_GROUP”:无效标识符 00904。00000 -“%s:无效标识符”*原因:*操作: 行错误:86 列:8
  • 您通常不要在一个查询中将DISTINCTGROUP BY 结合使用。你想消除什么?

标签: sql oracle group-by conditional-statements case


【解决方案1】:

这是用于您的设置的 CTE 方法(有一点限制 case

with ea as (
select 
CASE WHEN EA.TGT_TBL LIKE '%DWH_STAGE.%' THEN 'STAGE'
-- cur for brevity
     WHEN EA.TGT_TBL LIKE 'MPN_ETL_WORK.%' THEN 'VISA'
ELSE 'OTHER'
    END AS SCHEMA_GROUP
FROM BI_ETL_AUD EA)
select 
  SCHEMA_GROUP,
  COUNT(*),
  ROUND(100*RATIO_TO_REPORT(COUNT(*)) OVER (), 2) PERCENTAGE
from ea
group by SCHEMA_GROUP;

这会产生

SCHEM   COUNT(*) PERCENTAGE
----- ---------- ----------
OTHER          3         75
VISA           1         25

带有样本数据

create table BI_ETL_AUD as
select 'DEV_DWH_EDW.'  TGT_TBL from dual union all
select 'DEV_DWH_EDW.'  TGT_TBL from dual union all
select 'DEV_DWH_EDW.'  TGT_TBL from dual union all
select 'MPN_ETL_WORK.'  TGT_TBL from dual

您也可以始终使用单个查询,您需要在GROUP BY 列中复制大小写准确且没有别名

select 
  CASE WHEN EA.TGT_TBL LIKE '%DWH_STAGE.%' THEN 'STAGE'
  -- cur for brevity
     WHEN EA.TGT_TBL LIKE 'MPN_ETL_WORK.%' THEN 'VISA'
  ELSE 'OTHER'
    END AS SCHEMA_GROUP,
  COUNT(*),
  ROUND(100*RATIO_TO_REPORT(COUNT(*)) OVER (), 2) PERCENTAGE    
FROM BI_ETL_AUD EA
group by CASE WHEN EA.TGT_TBL LIKE '%DWH_STAGE.%' THEN 'STAGE'
-- cur for brevity
     WHEN EA.TGT_TBL LIKE 'MPN_ETL_WORK.%' THEN 'VISA'
ELSE 'OTHER'
    END

【讨论】:

  • 非常感谢第二次查询非常有效,效果很好
  • 嗯,基本上这两个查询应该具有相同的性能。如果您必须经常更新CASE 语句并且忘记在group by 中进行相同的更改,您会发现第二种方法的缺点;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2018-10-27
  • 1970-01-01
相关资源
最近更新 更多