[英]Combining 2 CTEs with Multiple Selects into One Query
I am having trouble trying to combine these two CTEs into one query.我在尝试将这两个 CTE 合并为一个查询时遇到问题。 Can anyone help lead me in the right direction?
任何人都可以帮助引导我朝着正确的方向前进吗? I tried using comma after the first CTE and removing the 'WITH" in the second CTE, but not sure where to put the parentheses and getting an error:
我尝试在第一个 CTE 后使用逗号并删除第二个 CTE 中的“WITH”,但不确定将括号放在哪里并出现错误:
"Msg 156, Level 15, State 1, Line 33 Incorrect syntax near the keyword 'SELECT'. Msg 102, Level 15, State 1, Line 48 Incorrect syntax near ')'."
“消息 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 - Consider breaking up the ROW_NUMBER
queries into their separate CTE, then run SELECT DISTINCT
as final statement. IIUC - 考虑将
ROW_NUMBER
查询分解为它们单独的 CTE,然后运行SELECT DISTINCT
作为最终语句。 Right now, you call the very CTE inside itself causing recursion which does not appear to be what you need.现在,您调用内部的 CTE 导致递归,这似乎不是您需要的。 Below breaks up the two result sets:
下面分解了两个结果集:
-- 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
Should you need to merge aggregated results, place all four in separate CTEs:如果您需要合并聚合结果,请将所有四个放在单独的 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
Even add aggregates as two more CTEs!甚至将聚合添加为另外两个 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.