как найти пропущенные строки в оракуле - PullRequest
1 голос
/ 16 апреля 2010

У меня есть таблица с именем 2 таблицы

create table ORDERS (
    ORDER_NO NUMBER(38,0) not null,
    ORDER_DATE DATE not null,
    SHIP_DATE DATE null,
    SHIPPING_METHOD VARCHAR2(12) null,
    TAX_STATUS CHAR(1) null,
    SUBTOTAL NUMBER null,
    TAX_AMT NUMBER null,
    SHIPPING_CHARGE NUMBER null,
    TOTAL_AMT NUMBER null,
    CUSTOMER_NO NUMBER(38,0) null,
    EMPLOYEE_NO NUMBER(38,0) null,
    BRANCH_NO NUMBER(38,0) null,
    constraint ORDERS_ORDERNO_PK primary key (ORDER_NO) ); 

и

create table PAYMENTS (
    PAYMENT_NO NUMBER(38,0) NOT NULL,       
    CUSTOMER_NO NUMBER(38,0) null,
    ORDER_NO NUMBER(38,0) null,
    AMT_PAID NUMBER NULL,
    PAY_METHOD VARCHAR(10) NULL,
    DATE_PAID DATE  NULL,
    LATE_DAYS NUMBER NULL,
    LATE_FEES NUMBER NULL,
    constraint PAYMENTS_PAYMENTNO_PK primary key (PAYMENT_NO) );

Я пытаюсь выяснить, сколько поздних заказов у ​​каждого клиента. В столбце late_days таблицы PAYMENTS указывается, сколько дней клиент опаздывает на оплату любого конкретного заказа.

поэтому я делаю этот запрос

SELECT C.CUSTOMER_NO, C.lname, C.fname, sysdate, COUNT(P.ORDER_NO) as number_LATE_ORDERS
FROM CUSTOMER C, orders o, PAYMENTS P
WHERE C.CUSTOMER_NO = o.CUSTOMER_NO
AND P.order_no = o.order_no
AND P.LATE_DAYS>0
group by C.CUSTOMER_NO, C.lname, C.fname

Это означает, что я считаю заказы с задержкой платежей и поздние дни> 0. Но это дает мне только клиентов, у которых есть заказы с поздними днями> 0, но клиенты, у которых нет задержек, не отображаются. поэтому, если у одного клиента есть 5 заказов с просроченными платежами, то для этого клиента отображается 5, но если у клиента 0 запоздалых заказов, этот клиент не будет выбран в этом запросе. Есть ли способ выбрать всех клиентов, и если у него есть запоздалые заказы, он покажет номер, а также, если у него нет запоздалых заказов, он покажет 0.

Ответы [ 3 ]

2 голосов
/ 17 апреля 2010

Я бы вытащил всех клиентов / заказов / платежей, а затем просто определил количество поздних заказов в вашем списке выбора на основе поля late_days. Это предполагает только 1 строку несвоевременного платежа на строку заказа.

select c.customer_no, 
       c.lname, 
       c.fname, 
       sysdate,
       sum(case when p.late_days > 0 then 1
                else 0
       end) number_late_orders
  from customer c, 
       orders o, 
       payments p
 where c.customer_no = o.customer_no
   and p.order_no = o.order_no
group by c.customer_no, 
         c.lname, 
         c.fname
0 голосов
/ 25 мая 2010

Одно Внутреннее и одно внешнее соединение должны сделать свое дело. Я не проверял это, но я думаю, что значение NULL не учитывается, поэтому все клиенты, у которых есть заказы, будут показаны, но только платежи с поздними днями> 0 будут иметь записи и могут быть подсчитаны. Те клиенты, у которых нет результата в дополнительном выборе, создадут пустую запись в p.order_no, которую функция COUNT () не должна учитывать.

SELECT C.CUSTOMER_NO, C.lname, C.fname, sysdate, COUNT(P.ORDER_NO) as number_LATE_ORDERS
FROM CUSTOMER C 
INNER JOIN orders o ON (C.CUSTOMER_NO = o.CUSTOMER_NO) 
LEFT OUTER JOIN (SELECT * FROM PAYMENTS WHERE p.late_days > 0) P ON (P.order_no = o.order_no)
GROUP by C.CUSTOMER_NO, C.lname, C.fname
0 голосов
/ 16 апреля 2010

У вас есть клиенты без заказов и, если да, хотите ли вы их показывать? Я приму либо нет, либо "да и нет".

SELECT C.CUSTOMER_NO, C.lname, C.fname, sysdate, COUNT(P.ORDER_NO) as number_LATE_ORDERS
FROM CUSTOMER C 
  join orders o on C.CUSTOMER_NO = o.CUSTOMER_NO
  left outer join PAYMENTS P on P.order_no = o.order_no and P.LATE_DAYS>0
group by C.CUSTOMER_NO, C.lname, C.fname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...