Iseries
如果不符合條件,則返回帶有值的行
我有他的查詢可以正常工作,但是當沒有找到適合條件時,我需要它返回一行:
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 <> '001' AND D.CODPRO = '' AND E.CIRPIC <> 'HUB' AND E.ETASUP NOT IN ('30','40','60') AND D.CNFLIG <> '2' AND E.TOPMNQ = '1' AND D.CODPRO NOT IN ('TST UOP 1') GROUP BY D.CODACT, D.CODPRO, D.VALPRO