簡體   English   中英

在 DB2 SQL 中獲取鍵的記錄但顯示單獨鍵的值

[英]Get record for a key but display value for a separate key in DB2 SQL

所以我有一個表,其中包含 SHIP# 和 REF# 的復合主鍵。 每個 SHIP# 有兩個 REF# 代碼,即 BM 和 PO。 BM 字段是強制性的,但 PO 字段僅在用戶實際輸入內容時才會填充。 因此,基本的 select 將顯示如下內容:

SHIP#           REF#    VALUE
000002          BM      20001836                      
000002          PO      020                           
000003          BM      20001834                      
000003          PO      8-694                         
000004          BM      20001835                      

現在,您會注意到貨件 000004 只有 BM,沒有 PO。

我想顯示所有帶有 PO 值的貨件。 因此,如果 PO 值為空或不存在(如“000004”),則應簡單地輸入“-”。 由於 BM 是強制性的,您必須獲取 BM 存在但顯示 PO 字段值的所有記錄。

所以,output 應該是:

SHIP#           REF#    VALUE                     
000002          PO      020                           
000003          PO      8-694                         
000004          PO      -  

如果您需要更多說明,請告訴我。 謝謝。

您可以使用聚合:

select ship#, 'PO' as ref#,
       max(case when ref# = 'PO' then value end) as value 
from t
group by ship#

這將返回NULLvalue ——這似乎是一個非常好的選擇。 如果您真的想要'-' ,請使用COALESCE()

select ship#, 'PO' as ref#,
       coalesce(max(case when ref# = 'PO' then value end), '-') as value 
from t
group by ship#

針對自身的外部連接也可以完成這項工作。 例如:

select a.ship, 'PO' as ref, coalesce(b.value, '-') as value
from t a
left join t b on b.ship = a.ship and b.ref = 'PO'
where a.ref = 'BM'

結果:

SHIP    REF  VALUE
------  ---  -----
000002  PO   020
000003  PO   8-694
000004  PO   -

請參閱db<>fiddle的運行示例。

編輯 - 只查找沒有 PO 的 BM。

您可以使用相同的查詢並添加額外的謂詞and b.ship is null ,如下所示:

select a.ship, 'PO' as ref, coalesce(b.value, '-') as value
from t a
left join t b on b.ship = a.ship and b.ref = 'PO'
where a.ref = 'BM' 
  and b.ship is null

結果:

SHIP    REF  VALUE 
------- ---- ----- 
000004  PO   -     

請參閱db<>fiddle的運行示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM