Sql 将2个CTE和多个选择组合到一个查询中
我在尝试将这两个CTE合并到一个查询中时遇到困难。有人能帮我指引正确的方向吗?我尝试在第一个CTE之后使用逗号,并删除第二个CTE中的“WITH”,但不确定将括号放在何处,因此出现错误: 消息156,级别15,状态1,第33行关键字附近语法不正确 “选择”。Msg 102,15级,状态1,第48行附近语法不正确 样本数据:Sql 将2个CTE和多个选择组合到一个查询中,sql,sql-server,Sql,Sql Server,我在尝试将这两个CTE合并到一个查询中时遇到困难。有人能帮我指引正确的方向吗?我尝试在第一个CTE之后使用逗号,并删除第二个CTE中的“WITH”,但不确定将括号放在何处,因此出现错误: 消息156,级别15,状态1,第33行关键字附近语法不正确 “选择”。Msg 102,15级,状态1,第48行附近语法不正确 样本数据: IIUC-考虑将RoWo数查询拆分为它们各自的CTE,然后运行选择“区别为最终语句”。现在,您调用内部的CTE,导致递归,而这似乎不是您所需要的。下面将分解两个结果集:
IIUC-考虑将RoWo数查询拆分为它们各自的CTE,然后运行选择“区别为最终语句”。现在,您调用内部的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...),
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
IIUC-考虑将RoWo数查询拆分为它们各自的CTE,然后运行选择“区别为最终语句”。现在,您调用内部的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...),
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
在第一列之前添加半列:;具有在第二个拷贝之后,从第一个拷贝之前的半列中选择*;有了……就不是了;使用@zip。仅凭一句话是正确的。这个在语句的末尾,而不是开始处。我明白了,虽然在Dee之前您有一些代码没有显示给我们,但是我的badI仍然得到一个公共表表达式的递归成员“ANS_CTE”有多个递归引用。在第二次CTE结束时,关于从ANS_CTE中选择*我该怎么做?您试图实现什么?请包括样品数据和预期结果。这是一个不完整的SQL查询。定义CTE后必须有一个最终语句。在第一个前添加一个半列:;具有在第二个拷贝之后,从第一个拷贝之前的半列中选择*;有了……就不是了;使用@zip。仅凭一句话是正确的。这个在语句的末尾,而不是开始处。我明白了,虽然在Dee之前您有一些代码没有显示给我们,但是我的badI仍然得到一个公共表表达式的递归成员“ANS_CTE”有多个递归引用。在第二次CTE结束时,关于从ANS_CTE中选择*我该怎么做?您试图实现什么?请包括样品数据和预期结果。这是一个不完整的SQL查询。定义CTE后必须有最终声明。