DB2中按PO_ID合并行并移除NULL值的SQL实现需求
嘿,这个需求在DB2里用基础的聚合函数就能轻松实现!核心思路很简单:按PO_ID分组,然后对每个需要合并的列使用MAX()(或者MIN(),效果完全一致)——因为这两个聚合函数都会自动忽略NULL值,只保留分组内的非NULL有效值;如果某列在分组里全是NULL,聚合后就会返回NULL,完美匹配你的要求。
举个实际的例子,假设你的表名为PO_RECORDS,结构和数据如下:
PO_ID | ORDER_DATE | VENDOR_NAME | QUANTITY -------|------------|-------------|---------- PO001 | 2024-05-01 | NULL | 100 PO001 | NULL | Acme Corp | NULL PO002 | NULL | NULL | NULL
对应的SQL查询应该是这样:
SELECT PO_ID, MAX(ORDER_DATE) AS ORDER_DATE, MAX(VENDOR_NAME) AS VENDOR_NAME, MAX(QUANTITY) AS QUANTITY FROM PO_RECORDS GROUP BY PO_ID;
执行后得到的结果会是:
PO_ID | ORDER_DATE | VENDOR_NAME | QUANTITY -------|------------|-------------|---------- PO001 | 2024-05-01 | Acme Corp | 100 PO002 | NULL | NULL | NULL
为什么这个方法可行?
GROUP BY PO_ID:将相同采购订单ID的所有行归为一组MAX(列名):对分组内的列值取最大值,DB2在计算MAX时会自动跳过NULL值,所以只要分组内有非NULL的有效值,就会返回该值;如果全是NULL,结果就是NULL- 这个方案完全兼容你使用的QMF for Workstation z/OS V11.1 Fix Pack 3,因为
MAX()是DB2的标准聚合函数,没有版本兼容性问题
如果你的表中有DATE、TIME、TIMESTAMP这类特殊数据类型,MAX()同样适用——比如对于日期类型,它会返回分组内最新的非NULL日期;对于字符串类型,会返回字典序最大的非NULL值,都符合“保留有效值、移除NULL”的需求。
内容的提问来源于stack exchange,提问作者Juan Ignacio Durante
相关产品推荐
相关产品推荐

