合并忽略空值的行
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
我需要合并具有空值的行,并且只保留唯一的组合。
输出:
查询: 我试图取每组的最大值,但由于它考虑空值,因此没有合并。您能否建议如何组合值。
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