Oracle
僅當整個列的條件滿足時才返回值
任何人都可以幫助我如何實現以下結果
輸入數據
ORDER_NUMBER LINE_ITEM FLAG LP-13288 1 TRUE LP-13288 2 FALSE LP-13288 3 (null) LP-13288 4 FALSE LP-13289 1 FALSE LP-13289 2 FALSE LP-13290 1 TRUE LP-13290 2 TRUE LP-13290 3 TRUE LP-13292 1 FALSE LP-13293 2 TRUE
但我期待如下結果:
ORDER_NUMBER LINE_ITEM FLAG RESULT LP-13288 1 TRUE 0 LP-13288 2 FALSE 0 LP-13288 3 (null) 0 LP-13288 4 FALSE 0 LP-13289 1 FALSE 0 LP-13289 2 FALSE 0 LP-13290 1 TRUE 1 LP-13290 2 TRUE 1 LP-13290 3 TRUE 1 LP-13292 1 FALSE 0 LP-13293 2 TRUE 1
需要實施的場景
- 對於一組 order_number,如果所有訂單項都為“真”,則結果欄位需要為“1”
- 對於一組order_number,如果任何行項目包含混合標誌(真、假、空),則結果欄位需要填充“0”
任何幫助,將不勝感激。
您可以使用視窗聚合(帶有
OVER
子句的聚合函式)將條件應用於一列值,同時計算詳細資訊行的結果。以下是在您的情況下如何使用視窗聚合:SELECT order_number, line_item, flag, CASE COUNT(CASE flag WHEN 'true' THEN 1 END) OVER (PARTITION BY order_number) WHEN COUNT(*) OVER (PARTITION BY order_number) THEN 1 ELSE 0 END AS result FROM orders ;
該
COUNT(CASE flag WHEN 'true' THEN 1 END) OVER (PARTITION BY order_number)
表達式計算每個真值的數量,order_number
並為具有相同 的行返回相同的值order_number
。因此,您也可以在行組內生成相同的值。上述的一種變體(使用反向邏輯和一個計數而不是兩個計數):
SELECT order_number, line_item, flag, CASE WHEN COUNT(CASE flag WHEN 'true' THEN NULL ELSE 1 END) OVER (PARTITION BY order_number) = 0 THEN 1 ELSE 0 END AS result FROM orders ;