2011-10-10 16 views
1

現在、Oracle Database 10gのデータベースでGROUP BY文に問題が発生しています。問合せによるOracle Database 10gグループ

このデータベースには、広告、スタッフ、StaffGrade、StaffOnAdという4つのテーブルがあります。私が照会しようとしているのは、3人以上のスタッフが働いている広告のためのものです。その広告タイトルと、2より大きい支払い等級のスタッフの人数を記載します。

以下は私の試みです:

SELECT Camp.Title 
FROM Campaign Camp 
LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title 
LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo 
LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo 
WHERE StfOGrde.Grade > 2 AND Camp.Title IN (SELECT Camp2.Title FROM Campaign Camp2 
LEFT JOIN WorksOn Wo2 ON Camp2.Title = Wo2.Title 
WHERE COUNT(Camp2.Title) > 3) 
GROUP BY Camp.Title 

私は上記で受信したエラーは次のとおりです。ORA-00934:グループ機能は、ここで

私の周りを検索し、基本的にそのエラーが、私はグループ化だ道が間違っていると言われますが許可されていませんが、私はそれがなぜなのか分かりません。また、私はちょうど上記のコードをフォーマットする正しい方法があるのだろうか?

何か助けていただければ幸いです。

注:

  • 広告以下の表に関してはいくつかのより多くの情報は、基本的には、空気等の日付
  • スタッフが自分の個人情報が記録されたに関するフィールドがあります。
  • StaffGradeには、スタッフがどのような支払いをしているかが表示されます。
  • StaffOnAdは、広告のタイトルである によって、どのスタッフがどの広告に掲載されているかを示します。

EDIT 1:コメントの後に、次の試み:ORA-00937:いない単一グループグループ機能

EDIT 2

SELECT Camp.Title 
FROM Campaign Camp 
LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title 
LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo 
LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo 
WHERE StfOGrde.Grade > 2 AND Camp.Title IN (SELECT Camp2.Title FROM Campaign Camp2 
LEFT JOIN WorksOn Wo2 ON Camp2.Title = Wo2.Title 
HAVING COUNT(Camp2.Title) > 3) 
GROUP BY Camp.Title 

しかし、私は新しいエラーを受信しました:

SELECT Camp.Title 
FROM Campaign Camp 
    LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title 
    LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo 
    LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo 
WHERE StfOGrde.Grade > 2 
    AND Camp.Title IN 
     (SELECT Camp2.Title 
     FROM Campaign Camp2 
      LEFT JOIN WorksOn Wo2 
      ON Camp2.Title = Wo2.Title 
     GROUP BY Camp2.Title 
     HAVING COUNT(Camp2.Title) > 3 
    ) 
GROUP BY Camp.Title 

この改定クエリではエラーはありません。しかし、表示されている唯一の結果は、広告のタイトルです。私はまた、2より大きいグレード支払いでその広告に取り組んでいるスタッフの量が必要です。私はちょうど最後のグループごとの声明がこの問題を修正すると仮定しましたが、必要とは思わない。

答えて

2

まず...あなたがに入れて常には、中にいくつかの条件を選択します結合されたテーブルを左にすると、内部結合が行われます。 要件に基づい:広告タイトルと3人の以上のスタッフ

私のような何かをするだろうと2つの

  • 広告よりも支払いグレードのおろし金を持っているスタッフの数と

    • 一覧この:

      SELECT title, SumGradeGreaterThan2 
           FROM (SELECT camp.title, COUNT (*) AS StaffMembers, 
              SUM (CASE 
                WHEN stfogrde.grade > 2 
                 THEN 1 
                ELSE 0 
                END) AS SumGradeGreaterThan2 
             FROM Campaign Camp 
             LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title 
             LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo 
             LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo 
            GROUP BY camp.title) 
          WHERE StaffMembers > 3 
      
  • +0

    私はこれで混乱しています。私はそれを試して、それはデータが見つかりませんが返されます。グレードクとは何ですか?そしてそれはなぜケースステートメントの後ですか?また、totalstaffでは、それはStaffテーブルが正しいでしょうか? – George

    +0

    inner selectには、totalstaffという2つの計算カラムがあり、広告に関連するスタッフの総数とgradeok(またはそれを呼び出す唯一のエイリアス)を計算します。これはcaseカラムのエイリアスです支払いグレードが2より大きいスタッフの数を計算します。テストできる場合は、インナーセレクトだけを実行してください。 – Aitor

    +0

    私は、列の意味をクリアしようとするためにクエリを編集しました。 – Aitor

    1

    where句で集計関数を使用することはできません。これに

    WHERE COUNT(Camp2.Title) > 3) 
    

    :これを変更

    HAVING COUNT(Camp2.Title) > 3) 
    
    +0

    私はこのことについて読んだが、私は新しいエラーを取得 - ORA-00937:ない単一グループのグループ機能 – George

    +1

    @Georgeを - あなたを編集してください改訂されたクエリを投稿してください。 *構文エラー*が発生しています。実行中の実際のコードが表示されない限り、診断することはできません。 – APC

    1

    私はあなたが必要だと思う:すべての

    SELECT Camp.Title 
    FROM Campaign Camp 
        LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title 
        LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo 
        LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo 
    WHERE StfOGrde.Grade > 2 
        AND Camp.Title IN 
         (SELECT Camp2.Title 
         FROM Campaign Camp2 
          LEFT JOIN WorksOn Wo2 
          ON Camp2.Title = Wo2.Title 
         GROUP BY Camp2.Title    --- the GROUP BY was missing 
         HAVING COUNT(Camp2.Title) > 3  --- HAVING, not WHERE 
        ) 
    GROUP BY Camp.Title      --- is this needed? (or was misplaced?) 
    
    +0

    私の編集で述べたように、コードはエラーなく正常に動作し、最後のグループごとのステートメントは不要であることに同意しますが、広告に取り組んでいるスタッフの数が問題ではなく、テーブル結果の列 – George

    関連する問題