Sql 将2个CTE和多个选择组合到一个查询中

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,导致递归,而这似乎不是您所需要的。下面将分解两个结果集:

我在尝试将这两个CTE合并到一个查询中时遇到困难。有人能帮我指引正确的方向吗?我尝试在第一个CTE之后使用逗号,并删除第二个CTE中的“WITH”,但不确定将括号放在何处,因此出现错误:

消息156,级别15,状态1,第33行关键字附近语法不正确 “选择”。Msg 102,15级,状态1,第48行附近语法不正确

样本数据:


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后必须有最终声明。