[英]Combining 2 CTEs with Multiple Selects into One Query
我在嘗試將這兩個 CTE 合並為一個查詢時遇到問題。 任何人都可以幫助引導我朝着正確的方向前進嗎? 我嘗試在第一個 CTE 后使用逗號並刪除第二個 CTE 中的“WITH”,但不確定將括號放在哪里並出現錯誤:
“消息 156,級別 15,狀態 1,第 33 行關鍵字'SELECT'附近的語法不正確。消息 102,級別 15,狀態 1,第 48 行')'附近的語法不正確。”
WITH ATQInfant_CTE AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY ATQInfant_IndividualID ORDER BY ATQInfant_Date) AS rownum
FROM
[dbo].[vCDCP_rptInfantImprove]
UNION ALL
SELECT DISTINCT
A1.ATQInfant_IndividualID,
A1.ATQInfant_Date,
A1.InfantSum,
A2.InfantSum,
CASE
WHEN
A1.InfantSum > A2.InfantSum and
not exists(select 1 from ATQInfant_CTE A3 where A1.ATQInfant_IndividualID = A3.ATQInfant_IndividualID and A1.ATQInfant_Date < A3.ATQInfant_Date) THEN 1 ELSE 0
END AS flag
FROM
ATQInfant_CTE AS A1
INNER JOIN
ATQInfant_CTE AS A2 ON A1.ATQInfant_IndividualID = A2.ATQInfant_IndividualID
AND A1.rownum = A2.rownum + 1
),
ANS_CTE AS
( SELECT
*,
ROW_NUMBER() OVER (PARTITION BY ANS_IndividualID ORDER BY ANS_SubmitDate) AS rownum
FROM
[dbo].[vCDCP_rptANSImprove]
UNION ALL
SELECT DISTINCT
A1.ANS_IndividualID,
A1.ANS_SubmitDate,
A1.ANS_ArrSum,
A2.ANS_DepSum,
CASE
WHEN
A1.ANS_ArrSum > A2.ANS_DepSum and
not exists(select 1 from ANS_CTE A3 where A1.ANS_IndividualID = A3.ANS_IndividualID and A1.ANS_SubmitDate < A3.ANS_SubmitDate) THEN 1 ELSE 0
END AS flag
FROM
ANS_CTE AS A1
INNER JOIN
ANS_CTE AS A2 ON A1.ANS_IndividualID = A2.ANS_IndividualID
AND A1.rownum = A2.rownum + 1
)
IIUC - 考慮將ROW_NUMBER
查詢分解為它們單獨的 CTE,然后運行SELECT DISTINCT
作為最終語句。 現在,您調用內部的 CTE 導致遞歸,這似乎不是您需要的。 下面分解了兩個結果集:
-- First Query
WITH ATQInfant_CTE AS
(SELECT
*,
ROW_NUMBER() OVER (PARTITION BY ATQInfant_IndividualID
ORDER BY ATQInfant_Date) AS rownum
FROM
[dbo].[vCDCP_rptInfantImprove]
)
SELECT DISTINCT
A1.ATQInfant_IndividualID,
A1.ATQInfant_Date,
A1.InfantSum AS A1_InfantSum,
A2.InfantSum AS A2_InfantSum,
CASE
WHEN A1.InfantSum > A2.InfantSum AND
AND NOT EXISTS(SELECT 1 FROM ATQInfant_CTE A3
WHERE A1.ATQInfant_IndividualID = A3.ATQInfant_IndividualID
AND A1.ATQInfant_Date < A3.ATQInfant_Date)
THEN 1
ELSE 0
END AS flag
FROM
ATQInfant_CTE AS A1
INNER JOIN
ATQInfant_CTE AS A2 ON A1.ATQInfant_IndividualID = A2.ATQInfant_IndividualID
AND A1.rownum = A2.rownum + 1
-- Second Query
;WITH ANS_CTE AS
(SELECT
*,
ROW_NUMBER() OVER (PARTITION BY ANS_IndividualID
ORDER BY ANS_SubmitDate) AS rownum
FROM
[dbo].[vCDCP_rptANSImprove]
)
SELECT DISTINCT
A1.ANS_IndividualID,
A1.ANS_SubmitDate,
A1.ANS_ArrSum,
A2.ANS_DepSum,
CASE
WHEN A1.ANS_ArrSum > A2.ANS_DepSum
AND NOT EXISTS (SELECT 1 FROM ANS_CTE A3
WHERE A1.ANS_IndividualID = A3.ANS_IndividualID
AND A1.ANS_SubmitDate < A3.ANS_SubmitDate)
THEN 1
ELSE 0
END AS flag
FROM
ANS_CTE AS A1
INNER JOIN
ANS_CTE AS A2 ON A1.ANS_IndividualID = A2.ANS_IndividualID
AND A1.rownum = A2.rownum + 1
如果您需要合並聚合結果,請將所有四個放在單獨的 CTE 中:
WITH ATQInfant_CTE AS
(SELECT ...same as above...),
ATQ_Final AS
(SELECT DISTINCT ...same as above...),
ANS_CTE AS
(SELECT ...same as above...),
ANS_Final AS
(SELECT DISTINCT ...same as above...)
-- MERGE/JOIN OF AGGREGATIONS
SELECT *
FROM
(SELECT IndividualID,
SUM(A1_InfantSum) As Sum_A2_InfantSum,
SUM(A2_InfantSum) As Sum_A2_InfantSum,
SUM(Flag) AS Sum_ATQ_Flags
FROM ATQ_Final
GROUP BY IndividualID) agg1
FULL JOIN
(SELECT IndividualID,
SUM(ANS_ArrSum) As Sum_ANS_ArrSum,
SUM(ANS_DepSum) As Sum_ANS_ArrSum,
SUM(Flag) AS Sum_ANS_Flags
FROM ANS_Final
GROUP BY IndividualID) agg2
ON sub1.IndividualID = sub2.IndividualID
甚至將聚合添加為另外兩個 CTE!
WITH ATQInfant_CTE AS
(SELECT ...same as above...),
ATQ_Final AS
(SELECT DISTINCT ...same as above...),
ANS_CTE AS
(SELECT ...same as above...),
ANS_Final AS
(SELECT DISTINCT ...same as above...),
ATQ_Agg AS
(SELECT IndividualID,
SUM(A1_InfantSum) As Sum_A2_InfantSum,
SUM(A2_InfantSum) As Sum_A2_InfantSum,
SUM(Flag) AS Sum_ATQ_Flags
FROM ATQ_Final
GROUP BY IndividualID),
ANS_Agg AS
(SELECT IndividualID,
SUM(ANS_ArrSum) As Sum_ANS_ArrSum,
SUM(ANS_DepSum) As Sum_ANS_ArrSum,
SUM(Flag) AS Sum_ANS_Flags
FROM ANS_Final
GROUP BY IndividualID)
-- MERGE/JOIN OF AGGREGATIONS
SELECT *
FROM ATQ_Agg
FULL JOIN ANS_Agg
ON ATQ_Agg.IndividualID = ANS_Agg.IndividualID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.