сумма столбцов и разница в списке между строками - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь получить разницу между строками на основе группы по SELL_ID в таблице ниже,

table1 - (любезно предоставлено форматирование таблицы GitHub )

+---------+---------+----------+----------+------------------+---------+
| seq_ID  | REQ_ID  | CALL_ID  | SELL_ID  |     REGION       |  COUNT  |
+---------+---------+----------+----------+------------------+---------+
|    1    |    123  | C001     | S1       | AGL              |  510563 |
|    2    |    123  | C001     | S1       | USL              |  122967 |
|    3    |    123  | C001     | S1       | VALIC            |  614106 |
|    4    |    123  | C001     | S2       | Inforce          | 1247636 |
|    5    |    123  | C001     | S2       | NB               |       0 |
|    6    |    123  | C001     | S3       | Seriatim Summary | 1247636 |
+---------+---------+----------+----------+------------------+---------+

Я пытаюсь получить результаты, как показано ниже,

table2 -

+---------+---------+----------+----------+-------+
| seq_ID  | REQ_ID  | CALL_ID  | Summary  | COUNT |
+---------+---------+----------+----------+-------+
|    1    |    123  | C001     | S1_vs_S2 |     0 |
|    2    |    123  | C001     | S2_vs_S3 |     0 |
|    3    |    123  | C001     | S3_vs_s1 |     0 |
+---------+---------+----------+----------+-------+

S1_vs_S2 - это разница между (sum(count) from table1 where sell_id='S1') и (sum(count) from table1 where sell_id='S2')

Ниже приведенакод, который я использую, но не смог получить результаты,

INSERT INTO table2 (SEQ_ID, REQ_ID,call_id,summary,count) 
SELECT min(seq_id) seq_id
     , req_id
     , call_id
     , S1_vs_S2
     ,((SELECT sum(c2) FROM TABLE_STG_CTRL WHERE source='S1')-
        SELECT sum(c2) FROM TABLE_STG_CTRL WHERE source='S2'))
FROM table1
GROUP BY req_ID, Ctrl_ID, c1, source 
ORDER BY SEQ_ID ; 

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Сначала данные группы на sell_id, req_id, call_id.Это подзапрос t в моем коде.Затем самостоятельно включите этот результат и покажите разницу.Единственная проблема заключается в тщательном построении join условия:

демо с вашими данными выборки

with t as (
  select sell_id sid, req_id, call_id, sum(cnt) cnt
    from table1 
    group by sell_id, req_id, call_id )
select case t1.sid when 'S1' then 1 when 'S2' then 2 when 'S3' then 3 end id, 
       t1.req_id, t1.call_id, t1.sid||'_vs_'||t2.sid call_id, t1.cnt - t2.cnt diff
  from t t1 
  join t t2 on t1.req_id = t2.req_id 
           and t1.call_id = t2.call_id 
           and (t1.sid, t2.sid) in (('S1', 'S2'), ('S2', 'S3'), ('S3', 'S1'))
  order by id

Кстати, count является зарезервированным словом Oracle, избегайте таких имен при именовании столбцов и т. Д.

0 голосов
/ 11 декабря 2018

Делает ли это то, что вы хотите?

select req_id, call_id, sell_id,
       lead(sell_id) over (partition by req_id, call_id order by seq_id) as next_sell_id,
       (cnt -
        lead(cnt) over (partition by req_id, call_id order by seq_id)
       ) as diff
from (select req_id, call_id, sell_id, sum(count) as cnt, min(seq_id) as seq_id
      from t
      group by req_id, call_id, sell_id
     ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...