1

クラスの割り当てを行っていますが、1つの質問で問題が発生しているようです。この質問では、2つの結合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

では、その1つのコマンド内の3つの列すべてをカウント(個別)するにはどうすればよいでしょうか。標準のSQLを使用しています

編集して質問プロンプトを追加します(コピーして貼り付けます):

リクエストされた本ごとに、リクエストの数とコピーの数を表示します。タイトル、リクエスト数、本の部数を表示します。タイトル順に表示します。この質問のSQLクエリは、結合とカウントを組み合わせたものです。このようなクエリを理解するには、カウント関数の前に結合を処理する必要があることに注意してください。

また、結合によって重複データが作成される可能性があるため、必要に応じてcount(distinct ..)形式のcountを使用する必要があることにも注意してください。(提案:この質問で問題が発生した場合は、カウントとグループなしで結合の結果を確認し、これらの結果が既存のテーブルのデータである場合に必要なカウントを実行する方法を見つけてください。この余分なクエリは表示しないでください。あなたのレポートで。)。

仮定:特定の顧客が同じ本のリクエストを複数持つことはできません。テーブルREQUESTをテーブルBOOK_COPYと結合する場合、特定の本が表示される行数は、その本のリクエスト数の積であることに注意してください。とコピー数の。

更新:それはまだ100%正しくありません。

結合に使用される追加のテーブル(最初のテーブルはLITWORKテーブル、2番目のテーブルは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 に答える