[英]Conditional CROSS APPLY in SQL Server
我有以下查詢,它工作得很好:
版本 #1
SELECT
t.ScheduleId,t.BaseDate,t.AfterDate,
fn.ScheduleDate AS NextBillingDate
INTO
#Distinct_BillableMemberAgreementItems
FROM
Distinct_BillableMemberAgreementItems_CTE t
CROSS APPLY
dbo.fn_ScheduleCalculator(t.ScheduleId, t.BaseDate, t.AfterDate, 0, 1, NULL, NULL, NULL) fn
此外,我對上述查詢進行了以下更改,這些更改也可以正常工作:
版本 #2
SELECT
t.ScheduleId, t.BaseDate, t.AfterDate, t.memberagreementitemid,
fn.ScheduleDate AS NextBillingDate
INTO
#Distinct_BillableMemberAgreementItems
FROM
Distinct_BillableMemberAgreementItems_CTE t
CROSS APPLY
dbo.fn_ScheduleCalculator(t.ScheduleId, t.BaseDate, COALESCE(t.PreviousBillingDate, t.BaseDate), 0, 2, NULL, NULL, NULL) fn
WHERE
fn.RowNumber = 2
問題
現在,基於某種條件,我想在用戶定義的 function dbo.fn_ScheduleCalculator
中傳遞不同的參數,但我無法正確使用語法。
這是我想要實現的目標:
SELECT
t.ScheduleId, t.BaseDate, t.AfterDate, t.memberagreementitemid,
fn.ScheduleDate AS NextBillingDate
INTO
#Distinct_BillableMemberAgreementItems
FROM
Distinct_BillableMemberAgreementItems_CTE t
CROSS APPLY
IF ((COALESCE(t.PreviousBillingDate, t.LastInvoicedDate) = GETDATE())
OR (t.BaseDate <> GETDATE() and t.FromBilling = 0))
dbo.fn_ScheduleCalculator(t.ScheduleId, t.BaseDate, COALESCE(t.PreviousBillingDate, t.BaseDate), 0, 2, NULL, NULL, NULL) fn
WHERE
fn.RowNumber = 2
ELSE
dbo.fn_ScheduleCalculator(t.ScheduleId, t.BaseDate, t.AfterDate, 0, 1, NULL, NULL, NULL) fn)
我知道,如果不共享上述表格的一些數據,很難就如何實現我正在尋找的內容提出確切的語法建議,但即使有人可以建議我如何實現我正在尋找的內容,或者如果有任何問題您看到並可以指出的語法將有很大幫助。
這里:
dbo.fn_ScheduleCalculator
:是用戶定義的 function
Distinct_BillableMemberAgreementItems_CTE
:是一個 CTE
隨着對要求的澄清,您需要使用兩個查詢和 UNION ALL 將這兩個查詢合並在一起。 按照當前的要求,它將是這樣的。
SELECT t.ScheduleId
, t.BaseDate
, t.AfterDate
, t.memberagreementitemid
, fn.ScheduleDate AS NextBillingDate
INTO #Distinct_BillableMemberAgreementItems
FROM Distinct_BillableMemberAgreementItems_CTE t
CROSS APPLY dbo.fn_ScheduleCalculator(t.ScheduleId, t.BaseDate, COALESCE(t.PreviousBillingDate, t.BaseDate), 0, 2, NULL, NULL, NULL) fn
where
(
COALESCE(t.PreviousBillingDate, t.LastInvoicedDate) = GETDATE()
OR
(
t.BaseDate <> GETDATE()
and
t.FromBilling = 0
)
)
AND fn.RowNumber = 2
UNION ALL
SELECT t.ScheduleId
, t.BaseDate
, t.AfterDate
, t.memberagreementitemid
, fn.ScheduleDate AS NextBillingDate
INTO #Distinct_BillableMemberAgreementItems
FROM Distinct_BillableMemberAgreementItems_CTE t
CROSS APPLY dbo.fn_ScheduleCalculator(t.ScheduleId, t.BaseDate, t.AfterDate, 0, 1, NULL, NULL, NULL) fn
where NOT
(
COALESCE(t.PreviousBillingDate, t.LastInvoicedDate) = GETDATE()
OR
(
t.BaseDate <> GETDATE()
and
t.FromBilling = 0
)
)
您可以使用帶有虛擬表的CROSS APPLY
進行一些計算,然后將這些計算傳遞給 function。
我不知道計算的含義,所以我只是給了它們通用名稱。 我也不知道你的邏輯是否正確,我只是復制了你所展示的內容。
SELECT
t.ScheduleId,
t.BaseDate,
t.AfterDate,
t.memberagreementitemid,
fn.ScheduleDate AS NextBillingDate
INTO
#Distinct_BillableMemberAgreementItems
FROM
Distinct_BillableMemberAgreementItems_CTE t
CROSS APPLY (
SELECT
CASE WHEN ISNULL(t.PreviousBillingDate, t.LastInvoicedDate) = GETDATE()
OR (t.BaseDate <> GETDATE() AND t.FromBilling = 0)
THEN ISNULL(t.PreviousBillingDate, t.BaseDate)
ELSE t.AfterDate
END,
CASE WHEN ISNULL(t.PreviousBillingDate, t.LastInvoicedDate) = GETDATE()
OR (t.BaseDate <> GETDATE() AND t.FromBilling = 0)
THEN 2
ELSE 1
END
) v1(SomeCalculation1, SomeCalculation2)
CROSS APPLY dbo.fn_ScheduleCalculator(
t.ScheduleId,
t.BaseDate,
v.SomeCalculation1,
0,
v.SomeCalculation2,
NULL, NULL, NULL
) fn
WHERE
(v1.SomeCalculation2 = 1 OR fn.RowNumber = 2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.