简体   繁体   English

将 2 个 CTE 与多个选择合并为一个查询

[英]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
)

SAMPLE DATA:样本数据: 在此处输入图片说明

在此处输入图片说明

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM