'CTE works, but not getting all the data after group by

This is in snowflake. My goal was to eventually union a table that has data only by months. After making a CTE it works, but the data does not total up to match the original query.

My original query has data only by cases and not months, so the union does not work and thus I needed to make a CTE.

Original Query:

SELECT  DISTINCT *,
        CASE WHEN ASSET_READY_DATE >= ASSET_CHECKED_IN_DATE THEN
              TIMEDIFF('minute', ASSET_CHECKED_IN_DATE, ASSET_READY_DATE)/1440 END
              AS DT,

        CASE WHEN TIMEDIFF('second', ASSET_CHECKED_IN_DATE, ASSET_READY_DATE) > 60 
              AND TIMEDIFF('minute', ASSET_CHECKED_IN_DATE, ASSET_READY_DATE) < 259200
              THEN 1 ELSE 0 END QC,

        CASE WHEN ASSET_READY_DATE IS NULL THEN 'Open' ELSE 'Close' END CS
FROM
(
    SELECT  DISTINCT
            C.CASE_ID,
            M.DIVISION,
            C.DEALER_NAME,
            C.DEALER_ID,
            M.OWNERGROUPNAME,
            M.DEALERCODE,
            M.PHYSICALSTATE,
            M.COUNTRY,
            X.DPMNAM AS DPM_Name,

            CASE 
                   WHEN ((TO_TIMESTAMP(C.ASSET_CHECKED_IN_AT) IS NOT NULL AND TO_TIMESTAMP(C.STATUS_CHANGED_TO_CHECKED_IN_AT) IS NOT NULL)) THEN 
                        LEAST(TO_TIMESTAMP(C.Asset_checked_in_at),TO_TIMESTAMP(C.STATUS_CHANGED_TO_CHECKED_IN_AT))
                   WHEN ((TO_TIMESTAMP(C.ASSET_CHECKED_IN_AT) IS NULL AND TO_TIMESTAMP(C.STATUS_CHANGED_TO_CHECKED_IN_AT) IS NOT NULL)) THEN
                        TO_TIMESTAMP(C.STATUS_CHANGED_TO_CHECKED_IN_AT)
                   WHEN ((TO_TIMESTAMP(C.ASSET_CHECKED_IN_AT) IS NOT NULL AND TO_TIMESTAMP(C.STATUS_CHANGED_TO_CHECKED_IN_AT) IS NULL)) THEN
                        TO_TIMESTAMP(C.ASSET_CHECKED_IN_AT)
                   END AS ASSET_CHECKED_IN_DATE,

            TO_TIMESTAMP(C.STATUS_CHANGED_TO_COMPLETE_HERE_AT) AS ASSET_READY_DATE,
            TO_TIMESTAMP(C.NEW_CASE_CREATED_AT) AS NEW_CASE_CREATED_AT,
            TO_TIMESTAMP(C.CLOSED_AT) AS CASE_CLOSED_DATE,
  
            CASE
                    WHEN C.PROGRAM_TYPE ILIKE '%mobile%' THEN 'MOBILE'
                    WHEN C.PROGRAM_TYPE ILIKE '%service%' THEN 'SERVICE'
                   WHEN C.PROGRAM_TYPE ILIKE '%other%' THEN 'OTHER'
                    WHEN C.PROGRAM_TYPE ILIKE '%credit%' THEN 'CREDIT'
                   WHEN C.PROGRAM_TYPE ILIKE '%body%' THEN 'BODY SHOP'
                    WHEN C.PROGRAM_TYPE ILIKE '%internal%' THEN 'INTERNAL'
                   WHEN C.CLOSED_AT < '2020-09-01' THEN 'SERVICE'
                   ELSE 'UNCATEGORIZED'    END AS PROGRAM_TYPE

    FROM T1 AS C
    INNER JOIN T2 AS M ON C.ID1 = M.ID2
    LEFT JOIN  T3 AS X on M.ID2 = X.ID3  
  
    WHERE   TO_TIMESTAMP_NTZ(C.Closed_At) >= '2020-01-01 00:00:00.000'
            AND C.R_NUM IS NOT NULL
            AND (M.DEALERCATEGORY ILIKE 'DEAL' OR M.DEALERCATEGORY ILIKE 'RC')              
            AND M.DEALERUSAGE ILIKE 'PRO' 
            AND OWNERGROUPCODE != '22'
            AND M.DEALERCODE != '11'       
)

UNION ALL

SELECT DISTINCT 

CC AS CC,
CC AS CCDT,
CASE WHEN CC WITH DT ILIKE 0 THEN 0 ELSE CCDTC END SDT,
R.DIVISION,
DEALER_NAME,
OWNER_GROUP,
DEALER_CODE,
R.STATE,
X.CTRY,
X.DPMNAM AS DPM_NAME,
CLOSED_AT AS CASE_CLOSED_DATE

FROM T4 AS R
LEFT JOIN  T3 AS X ON R.ID4 = X.ID3

WHERE TO_DATE(CLOSED_AT) >= '2020-01-01'

My CTE which works, but case totals do not match original query

WITH CTE_A_ALPHA AS (
     
    SELECT 
        C.CASE_ID,
        M.DIVISION,
        C.DEALER_NAME,
        M.OWNERGROUPNAME,
        M.DEALERCODE,
        M.PHYSICALSTATE,
        M.COUNTRY,
        X.DPMNAM AS DPM_NAME,
        TO_TIMESTAMP(C.ASSET_CHECKED_IN_AT) AS ASSET_CHECKED_IN_AT_TS,
        TO_TIMESTAMP(C.STATUS_CHANGED_TO_CHECKED_IN_AT) as STATUS_CHANGED_TO_CHECKED_IN_AT_TS,
        TO_TIMESTAMP(C.STATUS_CHANGED_TO_COMPLETE_HERE_AT) AS ASSET_READY_DATE,
        TO_TIMESTAMP(C.NEW_CASE_CREATED_AT) AS NEW_CASE_CREATED_AT,
        TO_TIMESTAMP(C.CLOSED_AT) AS CASE_CLOSED_DATE,
        CASE
            WHEN PROGRAM_TYPE ILIKE '%mobile%' THEN 'MOBILE'
            WHEN PROGRAM_TYPE ILIKE '%service%' THEN 'SERVICE'
            WHEN PROGRAM_TYPE ILIKE '%other%' THEN 'OTHER'
            WHEN PROGRAM_TYPE ILIKE '%credit%' THEN 'CREDIT'
            WHEN PROGRAM_TYPE ILIKE '%body%' THEN 'BODY SHOP'
            WHEN PROGRAM_TYPE ILIKE '%internal%' THEN 'INTERNAL'
            WHEN CLOSED_AT < '2020-09-01' THEN 'SERVICE'
            ELSE 'UNCATEGORIZED' END AS PROGRAM_TYPE,
        CASE WHEN ASSET_READY_DATE IS NULL THEN 'Open' ELSE 'Close' END CS
        
    FROM T1 AS C
    INNER JOIN T2 AS M ON C.ID1 = M.ID2
    LEFT JOIN  T3 AS X on M.ID2 = X.ID3  

    WHERE TO_TIMESTAMP_NTZ(C.Closed_At) >= '2020-01-01 00:00:00.000'
            AND C.R_NUM IS NOT NULL
            AND (M.DEALERCATEGORY ILIKE 'DEAL' OR M.DEALERCATEGORY ILIKE 'RC')              
            AND M.DEALERUSAGE ILIKE 'PRO' 
            AND OWNERGROUPCODE != '22'
            AND M.DEALERCODE != '11'   
               
), CTE_A AS (
    SELECT 
        CASE_ID,
        DIVISION,
        DEALER_NAME,
        OWNERGROUPNAME,
        DEALERCODE,
        PHYSICALSTATE,
        COUNTRY,
        DPM_NAME,
  
        CASE 
            WHEN ASSET_CHECKED_IN_AT_TS IS NOT NULL AND STATUS_CHANGED_TO_CHECKED_IN_AT_TS IS NOT NULL THEN 
                LEAST(ASSET_CHECKED_IN_AT_TS, STATUS_CHANGED_TO_CHECKED_IN_AT_TS)
            WHEN ASSET_CHECKED_IN_AT_TS IS NULL AND STATUS_CHANGED_TO_CHECKED_IN_AT_TS IS NOT NULL THEN
                STATUS_CHANGED_TO_CHECKED_IN_AT_TS
            WHEN ASSET_CHECKED_IN_AT_TS IS NOT NULL AND STATUS_CHANGED_TO_CHECKED_IN_AT_TS IS NULL THEN
                ASSET_CHECKED_IN_AT_TS
        END AS ASSET_CHECKED_IN_DATE,
        ASSET_READY_DATE,
        NEW_CASE_CREATED_AT,
        CASE_CLOSED_DATE

   FROM CTE_A_ALPHA
  
), CTE_B AS (
    SELECT *,
        TIMEDIFF('second', ASSET_CHECKED_IN_DATE, ASSET_READY_DATE) AS TIMEDIFF_SEC,
        TIMEDIFF('minute', ASSET_CHECKED_in_DATE, ASSET_READY_DATE) AS TIMEDIFF_MIN
    FROM CTE_A
  
)

SELECT 
    
    COUNT(CASE_ID) AS CC,
    SUM(CASE WHEN TIMEDIFF_SEC > 60 AND TIMEDIFF_MIN < 259200 THEN 1 ELSE 0 END) AS CCWDT, 
    SUM(CASE WHEN ASSET_READY_DATE >= ASSET_CHECKED_IN_DATE THEN TIMEDIFF_MIN/1440 END) AS SDT,
    DIVISION,
    DEALER_NAME,
    OWNERGROUPNAME,        
    DEALERCODE, 
    PHYSICALSTATE,
    COUNTRY,
    DPM_NAME,
    TRUNC((CASE_CLOSED_DATE),'Month') AS CASE_CLOSED_MONTH

FROM CTE_B

GROUP BY
    DIVISION,
    DEALER_NAME,
    OWNERGROUPNAME,        
    DEALERCODE, 
    PHYSICALSTATE,
    COUNTRY,
    DPM_NAME,
    CASE_CLOSED_MONTH  
  
UNION ALL

SELECT DISTINCT 

CC AS CC,
CC AS CCDT,
CASE WHEN CC WITH DT ILIKE 0 THEN 0 ELSE CCDTC END SDT,
R.DIVISION,
DEALER_NAME,
OWNER_GROUP,
DEALER_CODE,
R.STATE,
X.CTRY,
X.DPMNAM AS DPM_NAME,
R.CLOSED_AT AS CD

FROM T4 AS R
LEFT JOIN  T3 AS X ON R.ID4 = X.ID3

WHERE TO_DATE(R.CLOSED_AT) >= '2020-01-01'

Please troubleshoot I have been stuck on this for quite some time. Thanks!



Solution 1:[1]

Maybe it's becuase you use DISTINCT in the original query but didn't use it on the next query and the result of query not equal with the orginal

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Pooya