获取键的记录但显示 DB2 中单独键的值 SQL

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

所以我有一个 table,它有一个用于 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 字段值的所有记录。

所以,输出应该是:

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#

This returns the value as NULL -- 这似乎是一个很好的选择。如果你真的想要 '-',那么使用 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 中的 运行 示例。

编辑 - 仅查找没有采购订单的 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 中的 运行 示例。