Group-By
如何使用 case 和 filter 與 group by 語句並進行聚合計算?
我想做以下事情
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
對於無法提供範例數據/列,我深表歉意。我不允許分享我的工作數據。
我被告知要實現的邏輯如下。
對於 , 的每個唯一對組合
col1
,col2
獲取一個名為 的構造屬性Quantity
。Quantity = col4
無論在哪裡col3 = 8
。如果col3 != 8
,則檢查SUM(col5) > 0
。如果是,則檢查col4 - SUM(col5) > 0
. 如果是,則保留記錄,否則跳過。根據我自己的觀察,我檢查
COUNT(DISTINCT col4)
了每一對獨特的col1
andcol2
是 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
我不知道它是否正確,因為我需要一個小樣本和預期的結果。