[英]Using calculation in Case Statement - Oracle SQL
嗨,sql向導和巫師,
我正在嘗試根據特定參數(案例類型)確定SLA天數。 對於每種案例類型,SLA天數的計算方式略有不同。 我的問題是:我是否使用CASE STATEMENT實現了這一目標? 我將放下目前為止無法使用的內容:
fifthlevel --with statement declaring sla days
AS (SELECT
CASE sla_days
WHEN fourthlevel.case_type = 'Complaint'
THEN sla_days =
( SELECT COUNT (*)
FROM (SELECT business_date
FROM ( SELECT TO_DATE ('01-01-2011', 'dd-mm-yyyy') + LEVEL - 1
business_date
FROM DUAL
CONNECT BY LEVEL <=
TO_DATE ('31-12-2099', 'dd-mm-yyyy')
- TO_DATE ('01-01-2011', 'dd-mm-yyyy')
+ 1) date_tab1
WHERE TO_CHAR (business_date, 'DY') NOT IN ('SAT', 'SUN')
AND business_date NOT IN (SELECT holiday_dt
FROM cisadm.ci_cal_hol
WHERE calendar_cd = 'WAW01'
)
) work_days1
WHERE work_days1.business_date > fourthlevel.correspondence_date
AND work_days1.business_date <= fourthlevel.close_date
)
WHEN fourthlevel.case_type = 'Enquiry'
THEN sla_days = (SELECT COUNT (*)
FROM (SELECT business_date
FROM (SELECT TO_DATE ('01-01-2011',
'dd-mm-yyyy')
+ LEVEL
- 1
business_date
FROM DUAL
CONNECT BY LEVEL <=TO_DATE('31-12-2099',
'dd-mm-yyyy')
TO_DATE('01-01-2011',
'dd-mm-yyyy')+ 1
) date_tab1
WHERE TO_CHAR (business_date, 'DY')
NOT IN ('SAT', 'SUN')
AND business_date
NOT IN (SELECT holiday_dt
FROM cisadm.ci_cal_hol
WHERE calendar_cd = 'WAW01'
)
) work_days1
WHERE work_days1.business_date > fourthlevel.agreed_Date
AND work_days1.business_date <=
fourthlevel.close_date
)
END
FROM fourthlevel,
fourthlevel.* --also wanting to select * from preceding WITH statement
FROM fourthlevel)
好的,這看起來有些混亂,但是從本質上來說,我試圖基於“投訴”和“詢問”的case_types進行兩種不同的計算。
誰能指出我正確的方向?
讓我知道是否可以提供更多信息。
傳奇!
似乎兩個case_type之間的唯一區別是work_days1.business_date
的條件。 因此,您可以壓縮查詢,如下所示:
fifthlevel --with statement declaring sla days
AS (
SELECT
COUNT (*) sla_days
FROM
(
SELECT
business_date
FROM
(
SELECT
TO_DATE ('01-01-2011', 'dd-mm-yyyy') + LEVEL- 1 business_date
FROM
DUAL
CONNECT BY LEVEL <= TO_DATE ('31-12-2099','dd-mm-yyyy') - TO_DATE ('01-01-2011','dd-mm-yyyy') + 1
)
date_tab1
WHERE TO_CHAR (business_date, 'DY') NOT IN ('SAT', 'SUN')
AND business_date NOT IN (SELECT holiday_dt FROM cisadm.ci_cal_hol WHERE calendar_cd = 'WAW01')
)
work_days1 INNER JOIN fourthlevel
ON
work_days1.business_date > (
CASE
WHEN fourthlevel.case_type = 'Complaint' THEN fourthlevel.correspondence_date
WHEN fourthlevel.case_type = 'Enquiry' THEN fourthlevel.agreed_Date
END)
AND work_days1.business_date <= fourthlevel.close_date;
將work_days1子查詢提取為單獨的CTE:
, work_days1 as (
SELECT business_date
FROM ( SELECT TO_DATE ('01-01-2011', 'dd-mm-yyyy') + LEVEL - 1
business_date
FROM DUAL
CONNECT BY LEVEL <=
TO_DATE ('31-12-2099', 'dd-mm-yyyy')
- TO_DATE ('01-01-2011', 'dd-mm-yyyy')
+ 1) date_tab1
WHERE TO_CHAR (business_date, 'DY') NOT IN ('SAT', 'SUN')
AND business_date NOT IN (SELECT holiday_dt
FROM cisadm.ci_cal_hol
WHERE calendar_cd = 'WAW01')),
fifthlevel --with statement declaring sla days
AS (SELECT
CASE
WHEN fourthlevel.case_type = 'Complaint'
THEN (SELECT COUNT(*) FROM work_days1 WHERE
work_days1.business_date > fourthlevel.correspondence_date
AND work_days1.business_date <= fourthlevel.close_date)
WHEN fourthlevel.case_type = 'Enquiry'
THEN sla_days = (SELECT COUNT (*) work_days1 WHERE
work_days1.business_date > fourthlevel.agreed_Date
AND work_days1.business_date <=
fourthlevel.close_date) END as sla_days, *
FROM fourthlevel)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.