所以我有一个表,它有一个SHIP#&参考编号。每个SHIP#有两个REF#代码,即BM和PO。BM字段是必需的,但PO字段只有在用户实际输入内容时才会填充。因此,一个基本的选择会显示这样的内容:
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 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<gt;不停摆弄
编辑-只查找没有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<gt;不停摆弄
您可以使用聚合:
select ship#, 'PO' as ref#,
max(case when ref# = 'PO' then value end) as value
from t
group by ship#
这会将value
返回为NULL
——这似乎是一个非常好的选择。如果你真的想要'-'
,那么使用COALESCE()
:
select ship#, 'PO' as ref#,
coalesce(max(case when ref# = 'PO' then value end), '-') as value
from t
group by ship#