簡體   English   中英

將 2 個 CTE 與多個選擇合並為一個查詢

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM