簡體   English   中英

SQL 查詢以在內部使用案例語句並聚合 Function

[英]SQL Query to use a Case Statement within and Aggregate Function

我在下面有一個查詢,我需要獲取事件記錄 = 0 的計數。第一級是它為計算總數而抓取的記錄的摘要。 我嘗試使用 COUNT(INCIDENTS.='0') 但它顯然無法正常工作,盡管它不會出錯? 我怎么會得到這個計數。 如果這是一個因素,這在 Snowflake 中:案例語句: CASE WHEN SUM(INCIDENTS) = '0' THEN '0' ELSE COUNT(INCIDENTS!='0') END AS INCIDENTS Works 但引用這些事件的第二行似乎只給出一個計數而不是它之前的案例陳述的結果:

SELECT DRIVER_NAME, DRIVER_ID, CSC, SUM(DISTINCT(OBSERVATIONS)) AS OBSERVATIONS, --SUM(DISTINCT(INCIDENTS)) AS INCIDENTS_SUM_DISTINCT, 
        --COUNT(INCIDENTS) AS INCIDENTS,
        COUNT(INCIDENTS!='0'),
        CASE WHEN SUM(INCIDENTS) = '0' THEN '0' ELSE COUNT(INCIDENTS!='0') END AS INCIDENTS,
        (COUNT(INCIDENTS!='0') / SUM(DISTINCT(OBSERVATIONS))) * 100 AS FREQUENCY_PERCENT,
        1 AS GOAL, (SUM(SIX_TEN_MPH) / SUM(DISTINCT(OBSERVATIONS))) * 100 AS SIX_TEN_PERCENT,
    (SUM(ELEVEN_FIFTEEN_MPH) / SUM(DISTINCT(OBSERVATIONS))) * 100 AS ELEVEN_FIFTEEN_PERCENT, 
    (SUM(SIXTEEN_PLUS_MPH) / SUM(DISTINCT(OBSERVATIONS))) * 100 AS SIXTEEN_PLUS_PERCENT
        --SPEED_LIMIT, SPEED, DIFFERENCE, REPORT_DATE, TIME,  
FROM
(
  SELECT A.DRIVER_NAME AS DRIVER_NAME, A.DRIVER_ID AS DRIVER_ID, C.TRC_TERMINAL AS CSC, A.OBSERVATIONS AS OBSERVATIONS, 
    A.INCIDENTS AS INCIDENTS, B.SPEED_LIMIT AS SPEED_LIMIT, B.SPEED AS SPEED, B.DIFFERENCE AS DIFFERENCE,     
    A.REPORT_DATE AS REPORT_DATE, B.TIME AS TIME,    
  
    CASE WHEN DIFFERENCE >= 6 AND DIFFERENCE <= 10 THEN '1' WHEN DIFFERENCE IS NULL THEN '0' ELSE '0' END AS SIX_TEN_MPH,
    CASE WHEN DIFFERENCE > 10 AND DIFFERENCE <= 15 THEN '1' WHEN DIFFERENCE IS NULL THEN '0' ELSE '0' END AS ELEVEN_FIFTEEN_MPH,
    CASE WHEN DIFFERENCE > 15 THEN '1' WHEN DIFFERENCE IS NULL THEN '0' ELSE '0' END AS SIXTEEN_PLUS_MPH
  
  FROM "PROD"."PUBLIC"."SG_DRIVER_TREND" A
  LEFT JOIN "PROD"."PUBLIC"."SG_DRIVER_INCIDENTS" B
    ON A.DRIVER_ID = B.DRIVER_ID
  LEFT JOIN "PROD"."PUBLIC"."TMW_TRACTORPROFILE" C
    ON B.Vehicle = C.TRC_NUMBER 
    
  WHERE A.DRIVER_ID != ''  
    AND A.REPORT_DATE BETWEEN '2022-07-01' AND '2022-07-31'
    AND B.TIME BETWEEN '2022-07-01' AND '2022-07-31'
       AND SUBSTRING(B.TIME, 0, 10) <= A.REPORT_DATE                                          -- Less than or equal to report date
       AND SUBSTRING(B.TIME, 0, 10) > SUBSTRING(DATEADD(week,-1, A.REPORT_DATE), 0, 10)       -- Greater than 1 week ago
  
  UNION
  
  --SELECT A.DRIVER_NAME AS DRIVER_NAME, A.DRIVER_ID AS DRIVER_ID, C.TRC_TERMINAL AS CSC, A.OBSERVATIONS AS OBSERVATIONS, 
  --  A.INCIDENTS AS INCIDENTS, B.SPEED_LIMIT AS SPEED_LIMIT, B.SPEED AS SPEED, B.DIFFERENCE AS DIFFERENCE,     
  --  A.REPORT_DATE AS REPORT_DATE, B.TIME AS TIME,  
  SELECT DISTINCT(A.DRIVER_NAME) AS DRIVER_NAME, A.DRIVER_ID AS DRIVER_ID, 
            C.TRC_TERMINAL AS CSC, 
  --'UPT' AS CSC,
  A.OBSERVATIONS AS OBSERVATIONS, 
    '0' AS INCIDENTS, '0' AS SPEED_LIMIT, '0' AS SPEED, '0' AS DIFFERENCE,     
    A.REPORT_DATE AS REPORT_DATE, '' AS TIME, 
  
    '0' AS SIX_TEN_MPH,
    '0' AS ELEVEN_FIFTEEN_MPH,
    '0' AS SIXTEEN_PLUS_MPH
  
  FROM "PROD"."PUBLIC"."SG_DRIVER_TREND" A
  LEFT JOIN "PROD"."PUBLIC"."SG_DRIVER_INCIDENTS" B
   ON A.DRIVER_ID = B.DRIVER_ID
    
  --  AND SUBSTRING(B.TIME, 0, 10) <= A.REPORT_DATE                                          -- Less than or equal to report date
  --  AND SUBSTRING(B.TIME, 0, 10) > SUBSTRING(DATEADD(week,-1, A.REPORT_DATE), 0, 10)       -- Greater than 1 week ago
    
  INNER JOIN "PROD"."PUBLIC"."TMW_TRACTORPROFILE" C
    ON B.Vehicle = C.TRC_NUMBER 
    
     
  WHERE NOT EXISTS (SELECT DRIVER_ID FROM "PROD"."PUBLIC"."SG_DRIVER_INCIDENTS" D 
                    WHERE A.DRIVER_ID = D.DRIVER_ID 
                    AND D.TIME BETWEEN '2022-07-01' AND '2022-07-31'
                    AND SUBSTRING(D.TIME, 0, 10) <= A.REPORT_DATE                                          -- Less than or equal to report date 
                    AND SUBSTRING(D.TIME, 0, 10) > SUBSTRING(DATEADD(week,-1, A.REPORT_DATE), 0, 10)       -- Greater than 1 week ago
                   )                            
    AND A.DRIVER_ID != ''  AND A.INCIDENTS = '0' 
    AND A.REPORT_DATE BETWEEN '2022-07-01' AND '2022-07-31'
  --AND B.DRIVER_ID IS NULL     --<-- For LEFT JOIN
  ORDER BY DRIVER_ID    
)
--WHERE INCIDENTS != 0 
GROUP BY DRIVER_ID, DRIVER_NAME, CSC
ORDER BY DRIVER_ID

這一行:
CASE WHEN SUM(INCIDENTS) = '0' THEN '0' ELSE COUNT(INCIDENTS!='0') END AS INCIDENTS似乎給了我正確的事件數量但是當我嘗試將它復制到這一行作為事件計數: (COUNT(INCIDENTS!='0') / SUM(DISTINCT(OBSERVATIONS))) * 100 AS FREQUENCY_PERCENT如: (COUNT(CASE WHEN SUM(INCIDENTS) = '0' THEN '0' ELSE COUNT(INCIDENTS!='0') END) / SUM(DISTINCT(OBSERVATIONS))) * 100 AS FREQUENCY_PERCENT ,我收到以下錯誤: SQL compilation error: Aggregate functions cannot be nested: [SUM(CAST("values".INCIDENTS AS FLOAT))] nested in [COUNT(IFF((SUM(CAST("values".INCIDENTS AS FLOAT))) = (CAST('0' AS FLOAT)), TO_NUMBER('0', 18, 0), COUNT(CAST("values".INCIDENTS != '0' AS BOOLEAN))))]

我在網上看到了嵌套聚合函數工作的例子。 代碼示例表示贊賞。

第一行:

CASE WHEN SUM(INCIDENTS) = '0' THEN '0' ELSE COUNT(INCIDENTS!='0') END

是一個條件聚合,簡化為COUNT_IF

COUNT_IF(INCIDENTS != '0') AS INCIDENTS

第二個:

COUNT_IF(INCIDENTS != '0')/NULLIF(SUM(DISTINCT OBSERVATIONS)),0) * 100 
AS FREQUENCY_PERCENT

防止除以 0 總是好的,因此NULLIF(exp, 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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