1

我正在做课堂作业,似乎在一个问题上遇到了一些麻烦。这个问题需要我两个连接 3 个表并计算每行的出现总数。

这是我到目前为止的连接命令(需要弄清楚我可以在哪里放置一个嵌套计数(不同):

SELECT litwork.btitle,
       bookcopy.copy_num,
       request.rdate
FROM   litwork,
       bookcopy,
       request
WHERE  litwork.lit_id = bookcopy.lit_id
       AND bookcopy.persidh = request.persid
ORDER  BY btitle;  

连接给了我这个表作为结果:

BTITLE           COPY_NUM        RDATE
--------------- --------------  -------
Bankers          2                18-oct-2012
Bankers          2                30-oct-2012
Blue Ridge       1                20-oct-2012
Linux            1                18-oct-2012
Linux            1                30-oct-2012
My Life          3                31-oct-2012
O-O Design       1                30-oct-2012
O-O Design       3                25-oct-2012
O-O Design       3                18-oct-2012

那么我将如何为该命令中的所有三列进行计数(不同)?我正在使用标准 SQL

编辑以添加问题提示(复制并粘贴):

显示每本书的请求数量和副本数量。显示书名、请求数、书本数。按标题顺序显示。此问题的 SQL 查询将连接与计数混合在一起。要理解这样的查询,请注意必须在 count 函数之前处理连接。

另请注意,连接可能会创建重复数据,因此您应该在需要时使用 count(distinct ..) 形式的计数。(建议:如果您对这个问题有疑问,请查看没有计数和组的连接结果,并弄清楚如果这些结果是现有表的数据,您将如何执行所需的计数。请不要显示这个额外的查询在你的报告中。)。

假设:给定客户可能对同一本书的请求不超过一个。请注意,将表 REQUEST 与表 BOOK_COPY 连接时,给定书出现的行数是对该书的请求数的乘积以及份数。

更新:它仍然不是 100% 正确..

用于连接的附加表(第一个是 LITWORK 表,第二个是 REQUEST 表,最后一个是 BOOKCOPY 表)

    LIT_ID BTITLE                YEAR
---------- --------------- ----------
      1001 The Trojans           2000
      1002 My Life               2001
      1003 Nature                1998
      1004 Blue Ridge            1996
      1005 True Java             2012
      1006 CPlus                 2004
      1007 Streaming             2000
      1008 MyApps                1998
      1009 O-O Design            2012
      1010 Camping               1978
      1011 Bankers               1970
      1012 Linux                 1962


    LIT_ID     PERSID BNAME    RDATE            RTIME
---------- ---------- -------- ----------- ----------
      1001         11 College  18-oct-2012
      1001          7 College  25-oct-2012
      1003          8 La Jolla 20-oct-2012
      1005          7 Pacific  18-oct-2012
      1008         11 Atlantic 30-oct-2012
      1008          1 College  30-oct-2012
      1012          4 La Jolla 31-oct-2012

    LIT_ID   COPY_NUM PERSID_OUT DATE_OUT    DATE_DUE       PERSIDH HDATE       BNAMEP   BNAMEC
---------- ---------- ---------- ----------- ----------- ---------- ----------- -------- --------
      1001          1          4 13-sep-2012 27-nov-2012                        La Jolla
      1002          1                                                           Pacific  Atlantic
      1002          2          1 02-sep-2012 12-oct-2012                        Pacific
      1002          3                                             4 15-nov-2012 La Jolla La Jolla
      1003          1          9 10-dec-2012 30-dec-2012                        Pacific
      1003          2          1 13-dec-2012 22-jan-2013                        La Jolla
      1003          3                                                           Atlantic Atlantic
      1004          1                                             8 19-nov-2012 Pacific  College
      1004          2          4 04-dec-2012 17-feb-2013                        Pacific
      1004          3         10 11-oct-2012 31-oct-2012                        Atlantic
      1005          1          4 27-oct-2012 10-jan-2013                        La Jolla
      1005          2          1 19-sep-2012 29-oct-2012                        Pacific
      1006          1          7 29-jan-2012 09-mar-2012                        Pacific
      1006          2          1 07-jan-2012 16-feb-2012                        College
      1006          3                                                           Pacific  College
      1007          1          1 26-oct-2012 05-dec-2012                        Pacific
      1007          2                                                           Pacific  College
      1007          3          6 15-oct-2012 04-nov-2012                        La Jolla
      1008          1          4 23-oct-2012 06-jan-2013                        College
      1008          2          3 15-oct-2012 24-nov-2012                        Pacific
      1009          1                                             1 20-nov-2012 Pacific  Pacific
      1009          2         11 28-sep-2012 12-dec-2012                        Pacific
      1009          3                                             7 22-nov-2012 La Jolla College
      1010          1          1 01-sep-2012 11-oct-2012                        Pacific
      1011          1          4 31-jan-2012 15-apr-2012                        La Jolla
      1011          2                                            11 20-nov-2012 College  La Jolla
      1012          1                                            11 19-nov-2012 Pacific  Atlantic
      1012          2          3 29-oct-2012 08-dec-2012                        Pacific

这是我当前的 SQL 命令(不是我从 Gordon Linoff 的评论中得到的那个——它给了我 2-3 额外的行)

select   litwork.btitle, 
         count(distinct bookcopy.copy_num), 
         count(distinct request.rdate)
from     litwork, 
         bookcopy, 
         request 
where    litwork.lit_id=request.lit_id and
         bookcopy.persidh=request.persid 
group by btitle;

这给了我这张表(你可以看到我有所有正确数量的行[当你取出重复项时],但计数是错误的)

BTITLE          COUNT(DISTINCTBOOKCOPY.COPY_NUM) COUNT(DISTINCTREQUEST.RDATE)
--------------- -------------------------------- ----------------------------
Linux                                          1                            1
MyApps                                         2                            1
Nature                                         1                            1
The Trojans                                    3                            2
True Java                                      1                            1
4

1 回答 1

-2

以下内容应适用于 Oracle 的 SQL *Plus:

select litwork.btitle, count(distinct bookcopy.copy_num), count(distinct request.rdate)
from litwork, bookcopy, request
where litwork.lit_id = request.lit_id and request.lit_id = bookcopy.lit_id(+)
group by litwork.btitle;

有关联接的更多信息,请参阅Oracle SQL*Plus Pocket Reference, 2nd Edition

计数问题的可能解决方案:

  • 更改count(distinct request.rdate)count(distinct request.PERSID)
  • 更改count(distinct request.rdate)count(distinct request.*)
  • 更改count(distinct request.rdate)sum(case when request.rdate is null then 0 else 1 end)
  • (select lit_id, count(*) as requestCount from request group by lit_id)您可以加入然后选择 requestCount ,而不是加入请求表。

这可能是我能做的最好的事情,因为我没有字段的详细定义以及它们之间的关系。如果我有预期的结果和 SQL *Plus 来测试它,这也会有所帮助。

于 2012-12-04T23:34:58.640 回答