Как сделать несколько запросов из одной таблицы одновременно и сделать математические вычисления? - PullRequest
0 голосов
/ 23 февраля 2020

Я хотел бы получить следующий результат, но изо всех сил пытаюсь запросить лог c. Я хочу получить точное количество транзакций / счетов после удаления отмененных транзакций (- отрицательный custnb) из таблицы. Итак, с моей таблицей образцов у меня 5 транзакций, 2 отменены, поэтому я хотел бы получить только 3.

WANTED RESULT

Invoices     Customers

3            3

СТОЛ

invoicenumber         custnb     invoiceid

    1001              1          1001
    1002              2          1002
    1003              1          1003
    1004              5          1004
    1005              2          1005
    2000001           -1         1001
    2000002           -2         1002

Ответы [ 3 ]

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

То, как вы это выразили, возвращает желаемый результат; строки # 1 - 9 представляют примеры данных, поэтому код, который вам нужен, начинается со строки № 10.

SQL> with test (invoicenumber, custnb, invoiceid) as
  2    (select 1001,  1, 1001 from dual union all
  3     select 1002,  2, 1002 from dual union all
  4     select 1003,  1, 1003 from dual union all
  5     select 1004,  5, 1004 from dual union all
  6     select 1005,  2, 1005 from dual union all
  7     select 2001, -1, 1001 from dual union all
  8     select 2002, -2, 1002 from dual
  9    )
 10  select count(invoicenumber) invoices,
 11         count(custnb) customers
 12  from test
 13  where custnb > 0
 14    and invoicenumber not in (select invoiceid
 15                              from test
 16                              where custnb < 0
 17                             )
 18  ;

  INVOICES  CUSTOMERS
---------- ----------
         3          3

SQL>
0 голосов
/ 23 февраля 2020

Один из методов - агрегирование на уровне счета, а затем подсчет. Неотмененные счета будут иметь «положительное значение» custnb:

select count(*) as num_invoices, count(distinct custnb) as num_customers
from (select invoiceid
      from t
      group by invoiceid
      having min(custnb) > 0
     ) t;

Если custnb и invoiceid s выстроятся точно (как они сейчас делают), я бы подошел к этому, используя not exists:

select count(*) as num_invoices, count(distinct custnb) as num_custoers
from t
where not exists (select 1
                  from t t2
                  where t2.invoiceid = t.invoiceid and
                        t2.custnb = - t.custnb
                 );

Или, возможно, используя except:

select count(*) as num_invoices, count(distinct custnb)
from ((select invoiceid, custnb
       from t
       where custnb > 0
      ) except
      (select invoiceid, - custnb
       from t
       where custnb < 0
      )
     ) ic
0 голосов
/ 23 февраля 2020

Не проверено, но было бы что-то вроде этого. Кроме того, предполагается, что клиент может иметь несколько счетов.

select count(t.invoicenumber) invoices, count(distinct t.custnb) customers
from table t
where t.custnb > 0
and not exists (
 select 1 from table t2 
 where t2.invoiceid = t.invoiceid
 and t2.custnb < 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...