获取键的记录但显示 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 中的 运行 示例。
所以我有一个 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 中的 运行 示例。