![](/img/trans.png)
[英]SQL: Get an aggregate (SUM) of a calculation of two fields (DATEDIFF) that has conditional logic (CASE WHEN)
[英]How to get a Datediff calculation based on two different case statements?
我有一個很長的選擇查詢,但已在此處粘貼了相關部分。
我需要弄清楚如何獲取 OrderSignedDate 和 OrderIssuedDate 之間的 datediff,它們分別位於我的選擇查詢中的單獨 case 語句中。 任何幫助將不勝感激:
select tkh.task_id
,cas.case_number as CaseNo
,cst.description as CaseStatus
,cas.title as Title
,ztt.description as OrderType
,tkh.task_status
--Order Signed Date
,(select (case when
zrt.description = 'Administrative Law Judge'
and tka.completed_date is not null
then convert(varchar(10), tka.completed_date, 101) END)
from ecl_task_actor tka
join ecl_resource res on tka.entity_pk_id = res.resource_id
join ecl_z_resource_type zrt on res.resource_type_id = zrt.resource_type_id
where tka.task_id = tkh.task_id
and tka.task_actor_status <> 'D'
and zrt.description = 'Administrative law judge') as OrderSignedDate
--Date Order was Issued
,(select (case when
zrt.description = 'Order Processor Team'
and tka.completed_date is not null
then convert(varchar(10), tka.completed_date,101)
END)
from ecl_task_actor tka
join ecl_resource res on tka.entity_pk_id = res.resource_id
join ecl_z_resource_type zrt on res.resource_type_id = zrt.resource_type_id
where tka.task_id = tkh.task_id
and tka.task_actor_status <> 'D'
and zrt.description = 'Order processor Team') as OrderIssuedDate
from ecl_task_header tkh
join ecl_case cas on tkh.case_id = cas.case_id
JOIN ecl_z_case_status_type as cst on cst.case_status_type_id = cas.case_status_type_id
join ecl_z_task_type ztt on tkh.task_type_id = ztt.task_type_id
where ztt.description like '%Issue%'
order by cas.case_number asc
其實一點也不難。 您的選擇如下所示:
select ...,
(...) as OrderSignedDate,
(...) as OrderIssueDate,
...
... 表示某些東西在那里保持不變。 現在,讓我們將其用作table
:
select ..., OrderSignedDate, OrderIssueDate, ...,
from (
select ...,
(...) as OrderSignedDate,
(...) as OrderIssueDate,
...
) t
而在外部select
這是你的周圍包裹的初始select
,您可以使用OrderSignedDate
和OrderIssueDate
為列,你可以datediff
他們。
我假設您希望將此內聯添加到現有查詢中。
由於定義兩個現有日期的子選擇通過它們的WHERE
子句與外部查詢相關聯,因此沒有一種很好的方法可以避免重復代碼。 另一方面,這意味着它就像重復代碼一樣簡單。 使用現有的子選擇作為DATEDIFF
的參數。
這應該有效:
...<The current SELECT list, plus>
,DATEDIFF
(
DAY,
(--Order Signed Date
SELECT (CASE
WHEN zrt.description = 'Administrative Law Judge'
AND tka.completed_date IS NOT NULL
THEN CONVERT(varchar(10), tka.completed_date, 101)
END
)
FROM
ecl_task_actor AS tka
JOIN
ecl_resource AS res
ON
tka.entity_pk_id = res.resource_id
JOIN
ecl_z_resource_type AS zrt
ON
res.resource_type_id = zrt.resource_type_id
WHERE
tka.task_id = tkh.task_id
AND tka.task_actor_status <> 'D'
AND zrt.description = 'Administrative law judge'
),
(--Date Order was Issued
SELECT (CASE
WHEN zrt.description = 'Order Processor Team'
AND tka.completed_date IS NOT NULL
THEN CONVERT(varchar(10), tka.completed_date, 101)
END
)
FROM
ecl_task_actor AS tka
JOIN
ecl_resource AS res
ON
tka.entity_pk_id = res.resource_id
JOIN
ecl_z_resource_type AS zrt
ON
res.resource_type_id = zrt.resource_type_id
WHERE
tka.task_id = tkh.task_id
AND tka.task_actor_status <> 'D'
AND zrt.description = 'Order processor Team'
)
) AS DaysBetween
... <The rest of the query>
編輯:這應該有效,因為這兩個子選擇都解析為每行數據的日期,所以我們只是為DATEDIFF
函數重用這兩個日期。 它會增加一點開銷,但我的猜測是,對於已經如此龐大的查詢,瞬間性能不一定是主要問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.