3,491
社区成员
发帖
与我相关
我的任务
分享
WITH TMP AS
(SELECT 'a1' A, '2' AS B, 100 AS C
FROM DUAL
UNION ALL
SELECT 'a2' A, 'a1' AS B, 200 AS C
FROM DUAL
UNION ALL
SELECT 'a3' A, 'a1' AS B, 300 AS C
FROM DUAL
UNION ALL
SELECT 'b1' A, '5' AS B, 400 AS C
FROM DUAL
UNION ALL
SELECT 'b2' A, 'b1' AS B, 500 AS C
FROM DUAL)
SELECT A, B, C,
ROUND(MAX(X) OVER(PARTITION BY P) * C / SUM(C) OVER(PARTITION BY P),
2) D
FROM (SELECT T.*,
CASE
WHEN REGEXP_REPLACE(B, '\d') IS NULL THEN
A
ELSE
B
END AS P,
CASE
WHEN REGEXP_REPLACE(B, '\d') IS NULL THEN
B
END X
FROM TMP T)