сделать несколько выборов одновременно в оракуле - PullRequest
0 голосов
/ 04 мая 2018

Я хочу идти к таблице по одному шагу за раз, выбирая производительность. Могу ли я рассчитать COMPLETED_AMOUNT и PENDING_AMOUNT в одном запросе? Я упростил запрос, поэтому не могу добавить основной запрос, он становится меньше производительности

SELECT  D.COLUMN5,
           D.COLUMN2,
           (SELECT  SUM(J.AMOUNT)
              FROM EFT_TABLE J
             WHERE J.COLUMN1 = D.COLUMN1
               AND J.COLUMN2 = D.COLUMN2
               AND J.COLUMN3 = D.COLUMN3
               AND J.COLUMN4 = 'N'
               AND J.COLUMN5 = D.COLUMN5
               AND J.COLUMN6 = 'CL'
               AND J.COLUMN7 ='B'  )AS COMPLETED_AMOUNT,
           (SELECT  SUM(J.AMOUNT)
              FROM EFT_TABLE J
             WHERE J.COLUMN1 = D.COLUMN1
               AND J.COLUMN2 = D.COLUMN2
               AND J.COLUMN4 = 'N'
               AND J.COLUMN5 = D.COLUMN5
               AND J.COLUMN3 = D.COLUMN3
               AND J.COLUMN6 = 'WC'
               AND J.COLUMN7 = ('B') )AS PENDING_AMOUNT
      FROM EFT_TABLE D
     WHERE D.COLUMN7 = 'A'
    AND D.COLUMN3 >= trunc(sysdate-1) 
    AND D.COLUMN3 <= trunc(sysdate) 

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Условно агрегировать (т.е. использовать CASE WHEN внутри SUM):

select
  d.column5,
  d.column2,
  j.completed,
  j.pending
from eft_table d
left join
(
  select 
    column1, column2, column3, column5,
    sum(case when column6 = 'CL' then amount end) as completed,
    sum(case when column6 = 'WC' then amount end) as pending
  from eft_table
  where column4 = 'N'
    and column7 = 'B'
  group by column1, column2, column3, column5 
) j on  j.column1 = d.column1
    and j.column2 = d.column2
    and j.column3 = d.column3
    and j.column5 = d.column5
where d.column7 = 'A'
  and d.column3 between trunc(sysdate) - 1 and trunc(sysdate)
order by d.column5, d.column2;
0 голосов
/ 04 мая 2018

Вы можете один раз покинуть стол присоединения и суммировать сумму согласно COLUMN6. Попробуй это. Но это зависит от уникальности COLUMN5 и COLUMN2. Недостаточно данных для точного ответа.

SELECT D.COLUMN5, D.COLUMN2, 
       SUM(DECODE(J.COLUMN6, 'CL', J.AMOUNT, 0)) COMPLETED_AMOUNT,
       SUM(DECODE(J.COLUMN6, 'WC', J.AMOUNT, 0)) PENDING_AMOUNT
FROM EFT_TABLE D
     LEFT JOIN EFT_TABLE J ON (D.COLUMN1 = J.COLUMN1 AND
                               D.COLUMN2 = J.COLUMN2 AND
                               D.COLUMN3 = J.COLUMN3 AND
                               J.COLUMN4 = 'N' AND
                               D.COLUMN5 = J.COLUMN5 AND
                               J.COLUMN7 = 'B')
WHERE D.COLUMN7 = 'A'
  AND D.COLUMN3 >= trunc(sysdate-1) 
  AND D.COLUMN3 <= trunc(sysdate)
GROUP BY D.COLUMN5, D.COLUMN2  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...