将一行中的金额添加到具有相同主键的不同行中的金额

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;

干杯!!

【讨论】:

以上是关于将一行中的金额添加到具有相同主键的不同行中的金额的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel 中剪切/粘贴在同一行中的重复金额

具有数组字段的 bigquery 表中的不同行

使用相同的主键将值从一行添加到另一行 - Oracle SQL

如何将一个表中的行合并到另一个表中的另一行

如何将产品的订单金额汇总为一行

识别 2 个表中的不同行