Group-By

如何使用 case 和 filter 與 group by 語句並進行聚合計算?

  • January 25, 2019

我想做以下事情

SELECT
 PO.col1,
 PO.col2,
 CASE
      WHEN PO.col3 <> 8 THEN PO.col4
      WHEN PO.col3 = 8 
           THEN CASE
                     WHEN (ROUND(CAST(PO.col4 AS double) - SUM(CAST(PO.col5 AS double)), 2)) > 0 
                           AND SUM(CAST(PO.col5 AS double)) > 0
                           THEN ROUND(CAST(PO.col4 AS double) - SUM(CAST(PO.col5 AS double)), 2)
                     END
      END AS Quantity
FROM
 my_table AS PO
GROUP BY 
 PO.col1, PO.col2
HAVING 
 Quantity > 0

對於無法提供範例數據/列,我深表歉意。我不允許分享我的工作數據。

我被告知要實現的邏輯如下。

對於 , 的每個唯一對組合col1col2獲取一個名為 的構造屬性QuantityQuantity = col4無論在哪裡col3 = 8。如果col3 != 8,則檢查SUM(col5) > 0。如果是,則檢查col4 - SUM(col5) > 0. 如果是,則保留記錄,否則跳過。

根據我自己的觀察,我檢查COUNT(DISTINCT col4)了每一對獨特的col1andcol2是 1。我希望這有助於回答我的問題。

我們正在使用 Spark SQL,所以我不知道在問題中使用什麼標籤。

樣本數據

FWIW,我認為您最好將 PO.col3 的兩個案例分開,並將結果與 UNION 結合起來(我認為這是您之前所擁有的)。同時,我嘗試修復您的查詢,以便它在您的小提琴中編譯:

SELECT * FROM (
   SELECT
       PO.col1,
       PO.col2,
       CASE WHEN PO.col3 <> 8 THEN PO.col4::float
            WHEN PO.col3 = 8 
            THEN CASE WHEN (CAST(PO.col4 AS float) - SUM(CAST(PO.col5 AS float))) > 0 
                       AND SUM(CAST(PO.col5 AS float)) > 0
                      THEN (CAST(PO.col4 AS float) - SUM(CAST(PO.col5 AS float)))
                      END
            END AS Quantity
   FROM mytable AS PO
   GROUP BY PO.col1, PO.col2, PO.col3, PO.col4 
) AS T
WHERE Quantity > 0

我不知道它是否正確,因為我需要一個小樣本和預期的結果。

引用自:https://dba.stackexchange.com/questions/227942