从 case 语句 oracle sql 中按 Count 捕获条件语句组
Capture the Conditional statement group by Count from case statement oracle sql
您好,我正在尝试按组捕获计数,但我需要的组来自案例陈述中的人工列,我想知道如何实现这一点,下面是我正在使用的 sql 代码这可能使用 WITH CTE 吗?或者有没有任何最简单的方法,下面是查询以及现有结果和预期结果
db - Oracle 数据库 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 获取组(此列不在 table - CASE 语句中使用的人工列)
这是使用 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
您好,我正在尝试按组捕获计数,但我需要的组来自案例陈述中的人工列,我想知道如何实现这一点,下面是我正在使用的 sql 代码这可能使用 WITH CTE 吗?或者有没有任何最简单的方法,下面是查询以及现有结果和预期结果
db - Oracle 数据库 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 获取组(此列不在 table - CASE 语句中使用的人工列)
这是使用 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