Iseries

如果不符合條件,則返回帶有值的行

  • July 28, 2021

我有他的查詢可以正常工作,但是當沒有找到適合條件時,我需要它返回一行:

SELECT D.CODPRO, D.VALPRO, COALESCE(SUM(d.UVCLIV), 0)  AS SUM 
FROM FGE50LM0TV.GESUPE E LEFT JOIN FGE50LM0TV.GESUPD D   
ON E.NUMSUP=D.NUMSUP AND E.SNUSUP=D.SNUSUP               
WHERE E.CODACT = '001'                                         
AND D.CODPRO <> ''                                       
AND E.CIRPIC = 'HUB'                                     
AND E.ETASUP IN ('30','40','60')                         
AND D.CNFLIG = '2'                                       
AND E.TOPMNQ <> '1'                                      
AND D.CODPRO IN ('TST UOP 1')                                 
GROUP BY D.CODACT, D.CODPRO, D.VALPRO 

也許問題不是那麼清楚。讓我簡化一下:

當 CNFLIG 為 <> of ‘2’ 時,我希望以下查詢將 CODPRO、VALPRO、0 作為 UVCLIV 的總和返回:

SELECT CODPRO, VALPRO, COALESCE(SUM(UVCLIV), 0)  AS SUM 
FROM FGE50LM0TV.GESUPD                              
WHERE CNFLIG = '2'                                                                          
AND CODPRO IN ('TST UOP 1')                                 
GROUP BY CODACT, CODPRO, VALPRO ;

這就是我現在在表格中為這個產品所擁有的:

在此處輸入圖像描述

我使用此查詢將一行 PRODUCT、VARIANT、QUANTITY 插入到文件 (H) 中,方法是對來自另一個文件 (D) 的該 PRODUCT/VARIANT 的所有行求和。我有我寫的所有這些條件,並且我希望收到一條帶有 PRODUCT、VARIANT、0 作為 SUM 的行,用於 SQL 根據我的條件找不到任何內容的情況。

我沒有使用 MySQL 工作台。我正在使用 IBM Emulator Utility v 14.14

我的理解是

  • 對於其中的子集CODPRO IN ('TST UOP 1')FGE50LM0TV.GESUPD數據集具有CODPRO, VALPRO您想要的所有組合;
  • 並非所有組合都符合CNFLIG = '2';的附加條件
  • 您想獲得所有這些組合的總和,包括那些沒有CNFLIG = '2'.

如果我的理解是正確的,那麼您可以從子句中刪除CNFLIG = '2'條件並將其用作表達式的一部分,如下所示:WHERE``SUM``CASE

SELECT
 CODPRO
, VALPRO
, COALESCE(SUM(CASE WHEN CNFLIG = '2' THEN UVCLIV END), 0)  AS SUM
FROM
 FGE50LM0TV.GESUPD
WHERE
 CODPRO IN ('TST UOP 1')                            
GROUP BY
 CODACT
, CODPRO
, VALPRO
;

這樣,您就不會簡單地得到UVCLIV. 僅當is時才包含UVCLIV在總和中。否則,表達式的計算結果為 null 並且函式將其忽略。如果特定行組沒有與該條件匹配的單行,則將返回 null,但您可以將其變為 0。CNFLIG``'2'``SUM``SUM``COALESCE

我希望我能正確回答你的問題。只需將 where 子句一一顛倒,如下所示。這應該有效:

SELECT D.CODPRO, D.VALPRO, COALESCE(SUM(d.UVCLIV), 0)  AS SUM 
FROM FGE50LM0TV.GESUPE E LEFT JOIN FGE50LM0TV.GESUPD D   
ON E.NUMSUP=D.NUMSUP AND E.SNUSUP=D.SNUSUP               
WHERE E.CODACT &lt;&gt; '001'                                         
AND D.CODPRO = ''                                       
AND E.CIRPIC &lt;&gt; 'HUB'                                     
AND E.ETASUP NOT IN ('30','40','60')                         
AND D.CNFLIG &lt;&gt; '2'                                       
AND E.TOPMNQ = '1'                                      
AND D.CODPRO NOT IN ('TST UOP 1')                                 
GROUP BY D.CODACT, D.CODPRO, D.VALPRO 

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