Добавить сумму из одной строки к сумме в другой строке с тем же первичным ключом - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть запрос, в котором я хотел бы добавить сумму из одной строки к сумме другой строки. В основном для любого указанного c LLW, где WT_CPDS = 'ASBESTOS' и первое di git FYP_NUM не равно 5 или 6, id хотел бы добавить сумму Обязательства этого поля к сумме обязательства, где 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

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Вы можете использовать внешний запрос и оператор 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;

Cheers !!

1 голос
/ 01 февраля 2020

Вы можете использовать оконные функции:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...