2011-10-10 75 views
1

我目前在Oracle數據庫10g中使用我的數據庫時遇到了GROUP BY語句問題。SQL - Oracle數據庫10g組通過查詢

我該數據庫中有四個表 - 廣告,員工,StaffGrade和StaffOnAd。什麼我想查詢是與對他們的工作超過三名工作人員的廣告,我想列出廣告標題和工作人員誰擁有支付等級的數量大於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:嘗試了以下注釋後:

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 

然而,我收到一個新的錯誤:ORA-00937:不是一個單組基函數

編輯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 
     GROUP BY Camp2.Title 
     HAVING COUNT(Camp2.Title) > 3 
    ) 
GROUP BY Camp.Title 

此修訂查詢中沒有錯誤。但是,顯示的唯一結果是廣告的標題,我還需要在該廣告上工作的員工數量等級支付大於2.我只是假設最後一組通過聲明可以解決此問題,但我不要認爲它是必要的。

回答

2

首先......永遠,當你把你的選擇一些條件在左連接表,你會有一個內部連接。 根據您的要求:

  • 名單與廣告標題和工作人員誰擁有支付級研磨器比2個
  • 廣告超過3名工作人員

我會做類似的數這樣的:

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

我很困惑這一點。我試過了,它返回沒有找到數據。什麼是gradeok,爲什麼在案件陳述後?還有總員工,這將是員工表正確嗎? – George

+0

在內部select中,您有兩個計算列,totalstaff,用於計算與廣告相關的總員工記數,以及gradeok(或任何您想稱之爲唯一的別名),這是案例列的別名並計算有多少員工的付款等級大於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