SQL - Oracle Database 10g Группировка по запросам - PullRequest
1 голос
/ 10 октября 2011

В настоящее время у меня проблема с операторами GROUP BY в базе данных Oracle 10g с моей базой данных.

У меня есть четыре таблицы в этой базе данных - Advertisements, Staff, 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 показывает, какой сотрудник работает над какой рекламой название объявления.

РЕДАКТИРОВАТЬ 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 баллов. Я просто предположил, что последнее утверждение по группам решит эту проблему, но я не думай, что это необходимо.

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

Прежде всего ... Всегда, когда вы добавляете в свой выбор какое-то условие в левой объединенной таблице, у вас будет внутреннее соединение.Исходя из ваших требований:

  • Список с названием объявления и числом сотрудников, у которых уровень оплаты превышает 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
1 голос
/ 10 октября 2011

Я думаю, вам нужно:

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?)
1 голос
/ 10 октября 2011

Вы не можете использовать агрегатные функции в предложении where.Измените это:

WHERE COUNT(Camp2.Title) > 3)

на это:

HAVING COUNT(Camp2.Title) > 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...