过去3年中当count = 0时如何列出数据?

时间:2013-12-13 15:58:54

标签: sql oracle count correlated-subquery

我正在尝试制作一份在过去3年内没有销售的分支机构列表。我已经能够生成一份超过3年的销售清单,但没有在3年前增加0销售额的条件。

我的任务如下:列出所有未租用任何工具超过3年的分支。

我认为我必须做一个嵌套的子查询,但我无法弄清楚应该去哪里。以下是两个相关表及其描述和数据值。应该返回的唯一值是分支70的值。

SQL> desc toolorder
Name                           Null?    Type
--------------------------------------------------------- -------- ---
ORDERID                        NOT NULL VARCHAR2(6)
CUST                           NOT NULL VARCHAR2(6)
SNAME                          NOT NULL VARCHAR2(20)
BRANCHID                       NOT NULL VARCHAR2(6)
TYPE                           NOT NULL    VARCHAR2(15)
TOOLID                         NOT NULL VARCHAR2(6)
DATEOUT                        NOT NULL DATE
DUEDATE                        NOT NULL DATE



SQL> desc branch
Name                           Null?    Type 
--------------------------------------------------------------
BRANCHID                          NOT NULL VARCHAR2(6)
BNAME                             NOT NULL VARCHAR2(15)
ADDRESS                           NOT NULL VARCHAR2(25)
TELEPHONE                                  VARCHAR2(11)
MANAGERID                                  VARCHAR2(6)



SQL> select * from toolorder;

ORDERI CUSTOM SNAME                BRANCH TYPE            TOOLID DATEOUT   DUEDATE                                                          
------ ------ -------------------- ------ --------------- ------ --------- ---------                                                        
000001 000100 smith                10     Adhesive        00042  20-OCT-13 27-NOV-12                                                        
000002 000101 jones                10     Guage           00050  13-OCT-12 30-OCT-12                                                        
000003 000103 may                  10     Generic         00023  21-NOV-12 28-NOV-12                                                        
000004 000100 smith                10     Generic         00023  19-NOV-13 28-NOV-13                                                        
000005 000104 circus               10     Generic         00023  05-JAN-09 28-JAN-09                                                        
000006 000106 hanks                10     Wood            00062  11-APR-10 01-MAY-10                                                        
000007 000102 bond                 20     Cutting         00073  13-DEC-11 27-DEC-11                                                        
000008 000102 bond                 20     Guage           00053  13-DEC-11 27-DEC-11                                                        
000009 000104 circus               30     Generic         00025  13-DEC-06 28-DEC-06                                                        
000010 000104 circus               30     Brickwork       00035  13-DEC-06 28-DEC-06                                                        
000011 000105 harris               30     Cutting         00075  13-OCT-13 25-OCT-13                                                        
000012 000105 harris               40     Brickwork       00036  13-DEC-11 27-DEC-11                                                        
000013 000105 harris               40     Generic         00027  13-DEC-11 27-DEC-11                                                        
000014 000105 harris               40     Electric        00006  13-DEC-11 27-DEC-11                                                        
000015 000106 hanks                40     Adhesive        00046  13-MAY-11 27-MAY-11                                                        
000016 000107 head                 50     Adhesive        00047  13-MAR-13 27-MAR-13                                                        
000017 000107 head                 50     Wood            00018  13-MAR-13 27-MAR-13                                                        
000018 000101 jones                50     Guage           00055  06-JAN-13 20-JAN-13                                                        
000019 000103 may                  60     Brickwork       00039  06-APR-13 20-APR-13                                                        
000020 000101 jones                60     Cutting         00080  24-DEC-12 07-JAN-13                                                        
000021 000101 circus               70     Cutting         00081  13-AUG-08 27-AUG-08                                                        

21 rows selected.



SQL> select * from branch;

BRANCH BNAME           ADDRESS                   TELEPHONE   MANAGE                                                                         
------ --------------- ------------------------- ----------- ------                                                                         
10     Oxford          18 Oxford Estate          08456325312                                                                                
20     Greenwood       21 Greenwood Lane         02380282185                                                                                
30     Weston          36 Weston Road            02380282635                                                                                
40     Highstreet      12-15 Stafford Highstreet 02380865963                                                                                
50     Meadow          16 The Meadow Yard        07974296353                                                                                
60     Port Down       168 Port Down Av          08953164826                                                                                
70     Red Rd          12-15 Red Road            07948247384                                                                                

7 rows selected.

现在,运行以下查询将返回3年前的订单。我需要使用嵌套子查询来调整它(我认为),以便它检查3年内没有销售,但无法确定如何。

SQL> select count(toolorder.orderid) as rentalcount, branch.branchid, branch.bname,
branch.address from toolorder left outer join branch on toolorder.branchid =     
branch.branchid where MONTHS_BETWEEN(sysdate, dateout) > 36 group by branch.branchid, 
branch.bname, branch.address order by 1 desc;

RENTALCOUNT BRANCH BNAME           ADDRESS                                                                                                  
----------- ------ --------------- -------------------------                                                                                
      2 30     Weston          36 Weston Road                                                                                           
      2 10     Oxford          18 Oxford Estate                                                                                         
      1 70     Red Rd          12-15 Red Road                                                                                           

2 个答案:

答案 0 :(得分:2)

最简单的方法是为每个dateout获取最多branchid,并检查它是否超过36个月:

select b.*
from branch b join
     (select branchid, max(dateout) as maxd
      from toolorder
      group by branchid
     ) tob
     on b.branchid = tob.branchid
where MONTHS_BETWEEN(sysdate, tob.maxd) > 36;

答案 1 :(得分:0)

您可以使用NOT EXISTS检查相关子查询中是否存在匹配项:

SELECT *
FROM   branch b
WHERE  NOT EXISTS ( SELECT 1
                    FROM   toolorder r
                    WHERE  r.branchid = b.branchid
                    AND    MONTHS_BETWEEN(sysdate, dateout) <= 36 );

根据您对@Gordon Linoff的回答,看起来您想要删除匹配的行;在这种情况下你可以这样做:

DELETE FROM branch b
WHERE  NOT EXISTS ( SELECT 1
                    FROM   toolorder r
                    WHERE  r.branchid = b.branchid
                    AND    MONTHS_BETWEEN(sysdate, dateout) <= 36 );