将一行中的金额添加到具有相同主键的不同行中的金额
Posted
技术标签:
【中文标题】将一行中的金额添加到具有相同主键的不同行中的金额【英文标题】:Add amount from one row to amount in a different row with same primary key 【发布时间】:2020-01-31 21:06:02 【问题描述】:我有一个查询,我想将一行的金额添加到另一行的金额。基本上对于任何特定的 LLW,只要 WT_CPDS = 'ASBESTOS' 并且 FYP_NUM 的第一个数字不是 5 或 6,我想将此字段的义务金额添加到 WT_CPDS = 'CONTIN' 的义务金额中。
字段“MATCH”也可以用作主键,因为它是唯一标识符。我正在使用 Oracle SQL Developer。非常感谢任何帮助!
SELECT LLW.LLW, LLW.FYP_NUM, WT_CPDS, SUM(OBLIGATION) AS OBLIGATION, LLW.LLW || OB.WT_CPDS AS MATCH
FROM OBS_MASTER OB, LLW LLW
WHERE LLW.LLW = OB.PROJECT AND LLW.LLW = '049039'
GROUP BY LLW.LLW, LLW.FYP_NUM, WT_CPDS, LLW.LLW || OB.WT_CPDS
ORDER BY WT_CPDS
Actual Result:
LLW FYP_NUM WT_CPDS OBLIGATION MATCH
049039 4.090 ASBESTOS 14175.3 049039ASBESTOS
049039 4.090 CONTIN 384812.65 049039CONTIN
049039 4.090 DESIGN 21990.06 049039DESIGN
049039 4.090 SCOPE 8209.68 049039SCOPE
Expected Result:
LLW FYP_NUM WT_CPDS OBLIGATION MATCH
049039 4.090 ASBESTOS 14175.3 049039ASBESTOS
049039 4.090 CONTIN 398987.95 049039CONTIN
049039 4.090 DESIGN 21990.06 049039DESIGN
049039 4.090 SCOPE 8209.68 049039SCOPE
【问题讨论】:
【参考方案1】:你可以使用窗口函数:
SELECT LLW.LLW, LLW.FYP_NUM, WT_CPDS,
(SUM(OBLIGATION) +
(CASE WHEN WT_CPDS = 'CONTIN' AND FYP_NUM NOT IN (5, 6)
THEN SUM(CASE WHEN WT_CPDS = 'ASBESTOS' THEN OBLIGATION ELSE 0 END) OVER (PARTITION BY LLW)
ELSE 0
END) AS OBLIGATION,
LLW.LLW || OB.WT_CPDS AS MATCH
FROM OBS_MASTER OB JOIN
LLW LLW
ON LLW.LLW = OB.PROJECT AND LLW.LLW = '049039'
GROUP BY LLW.LLW, LLW.FYP_NUM, WT_CPDS, LLW.LLW || OB.WT_CPDS
ORDER BY WT_CPDS
【讨论】:
这很好用并且计算出正确的值,但我对其他 CASE...WHEN 语句有问题。似乎当第二个 WHEN 语句为真时查询停止并且不会继续到您刚刚帮助的第三个。有什么方法可以计算所有三个 WHEN 语句? OBS.OBLIGATION + CASE WHEN OBS.WT_CPDS = 'SCOPE' AND INHOU.CHARGE 不为 NULL THEN (INHOU.CHARGE) 当 OBS.WT_CPDS = 'CONTIN' 且 OBS.OBLIGATION 不为 NULL 并且OBS.OBLIGATION 0 AND ABS(OBS.OBLIGATION) > 0 THEN (-AWD.AWARD) 当 OBS.WT_CPDS = 'CONTIN' THEN SUM(当 OBS.WT_CPDS = 'ASBESTOS' AND SUBSTR(LLW.FYP_NUM,1) ,1) NOT IN (6,8) THEN OBS.OBLIGATION ELSE 0 END) OVER (Partition by LLW.LLW) ELSE case WHEN OBS.OBLIGATION 不为 NULL 然后 0 END 作为义务结束, 抱歉查询混乱,我不知道如何将其变成代码格式以供评论 @Manny 。 . .我想我确定了答案。我显然错过了第一次FYP_NUM
的条件。
我已经添加了,我已经解决了这个问题。最后一个问题。在我的原始查询中,我正在过滤特定的 LLW 以进行测试。当我删除 LLW 过滤器并查看整个人口时,我收到一个错误:ORA-01722:无效数字。你我怎么能克服这个?如果我删除 Windows 函数,case 语句将停止工作并返回 else 值,在本例中为 0。谢谢!【参考方案2】:
您可以使用外部查询和CASE ..WHEN
语句如下:
SELECT LLW, FYP_NUM, WT_CPDS,
OBLIGATION + CASE WHEN WT_CPDS = 'CONTIN' THEN SUM(CASE
WHEN TRUNC(FYP_NUM) NOT IN (5,6) AND WT_CPDS = 'ASBESTOS'
THEN OBLIGATION END) OVER (PARTITION BY LLW) ELSE 0 END AS OBLIGATION,
MATCH
FROM
(SELECT LLW.LLW, LLW.FYP_NUM, WT_CPDS,
SUM(OBLIGATION) AS OBLIGATION, LLW.LLW || OB.WT_CPDS AS MATCH
FROM OBS_MASTER OB, LLW LLW
WHERE LLW.LLW = OB.PROJECT AND LLW.LLW = '049039'
GROUP BY LLW.LLW, LLW.FYP_NUM, WT_CPDS, LLW.LLW || OB.WT_CPDS
)
ORDER BY WT_CPDS;
干杯!!
【讨论】:
以上是关于将一行中的金额添加到具有相同主键的不同行中的金额的主要内容,如果未能解决你的问题,请参考以下文章