【问题标题】:how to find missing rows in oracleoracle如何查找丢失的行
【发布时间】:2010-05-25 17:03:58
【问题描述】:

我有一张桌子叫 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) );

我试图找出每个客户有多少延迟订单。 PAYMENTS 表中的 late_days 列包含客户为任何特定订单付款迟到的天数。

所以我正在做这个查询

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

这意味着,我正在计算那些有任何延迟付款且late_days>0 的订单。但这只是给了我有任何订单的客户 late_days>0,但没有任何延迟订单的客户没有出现。因此,如果一个客户有 5 个延迟付款的订单,那么它会为该客户显示 5 个,但如果一个客户有 0 个延迟订单,则在此查询中未选择该客户。 有什么方法可以选择所有客户,如果他有任何迟到的订单,它会显示数字,如果他没有任何迟到的订单,它会显示0。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我会提取所有客户/订单/付款,然后根据 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
    

    【讨论】:

    • 可能还需要添加一个计数(*)来获取总订单数。这将使您可以比较 #total 与 #late,这可能很有用。
    【解决方案2】:

    您有没有任何订单的客户,如果有,您想向他们展示吗? 我会假设不是或“是且不是”。

    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
    

    【讨论】:

      【解决方案3】:

      一个内连接和一个外连接应该可以解决问题。我没有测试过,但我认为 NULL 值不计算在内,因此所有有订单的客户都会显示,但只有 late_days> 0 的付款才会有条目并且可以计算在内。那些在子选择中没有结果的客户将在 p.order_no 中产生一个 NULL 条目,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
      

      【讨论】:

        猜你喜欢
        • 2013-08-31
        • 2021-01-17
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多