合并忽略空值的行

Combine rows ignoring null values

我需要合并具有空值的行,并且只保留唯一的组合。

输出:

查询: 我试图取每组的最大值,但由于它考虑空值,因此没有合并。您能否建议如何组合值。

SELECT SALES_ORG 
              ,MAX(MATERIAL) OVER (PARTITION BY  SALES_ORG,MATERIAL ORDER BY MATERIAL) as MATERIAL
              ,MAX(MGROUP) OVER (PARTITION BY SALES_ORG,MATERIAL,MGROUP ORDER BY MGROUP  ) as MGROUP  
              ,MAX(SERVICE) OVER (PARTITION BY SALES_ORG,MATERIAL,MGROUP,SERVICE ORDER BY SERVICE  ) as SERVICE 
              
    FROM SALES
    

您可以通过汇总前 3 列并取 service 列的最大值来获得输出:

SELECT sales_org,
       material,
       mgroup,
       MAX(service) AS service
FROM   table_name
GROUP BY
       sales_org,
       material,
       mgroup;

其中,对于示例数据:

CREATE TABLE table_name (sales_org, material, mgroup, service) AS
SELECT 'XS13', NULL, 10,   'ZSERV1' FROM DUAL UNION ALL
SELECT 'XS13', 'M1', 10,   'ZSERV1' FROM DUAL UNION ALL
SELECT 'XS13', NULL, 10,   NULL     FROM DUAL UNION ALL
SELECT 'XS13', NULL, 10,   'ZSERV2' FROM DUAL UNION ALL
SELECT 'XS13', NULL, 11,   'ZSERV2' FROM DUAL UNION ALL
SELECT 'XS13', 'M2', 12,   'ZSERV2' FROM DUAL UNION ALL
SELECT 'XS14', 'M2', NULL, NULL     FROM DUAL;

给出输出:

SALES_ORG MATERIAL MGROUP SERVICE
XS13 null 10 ZSERV2
XS13 M1 10 ZSERV1
XS13 null 11 ZSERV2
XS13 M2 12 ZSERV2
XS14 M2 null null

更新:

来自评论:

I have to first check MGROUP/SERVICE/MATERIAL if this combination is present then ignore all the other with the same value/combination. If only SERVICE/MATERIAL is present Then ignore all the otehr below combination.

您可以使用分层查询将每一行连接到更具体的行,然后找到叶行:

SELECT DISTINCT
       sales_org,
       material,
       mgroup,
       service
FROM   table_name
WHERE  CONNECT_BY_ISLEAF = 1
CONNECT BY NOCYCLE
      (PRIOR sales_org = sales_org OR PRIOR sales_org IS NULL)
  AND (PRIOR material  = material  OR PRIOR material  IS NULL)
  AND (PRIOR mgroup    = mgroup    OR PRIOR mgroup    IS NULL)
  AND (PRIOR service   = service   OR PRIOR service   IS NULL);

输出与上面相同。

db<>fiddle here