Oracle

僅當整個列的條件滿足時才返回值

  • August 14, 2018

任何人都可以幫助我如何實現以下結果

輸入數據

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

需要實施的場景

  1. 對於一組 order_number,如果所有訂單項都為“真”,則結果欄位需要為“1”
  2. 對於一組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
;

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