ошибка в группе по предложению - PullRequest
0 голосов
/ 28 июня 2018

У меня ошибка при использовании метода group by clause в моей базе данных. Это мой код:

SELECT A.dvdID  AS 'DVD ID',
A.memberID AS 'MEMBER ID',
B.first_name AS 'FIRST NAME',
B.last_name AS 'LAST NAME',
A.branchID AS 'BRANCH ID',
COUNT(A.dvdID) AS 'Total DVDs Borrowed'
FROM RENT A
JOIN MEMBER B ON (B.memberID = A.memberID)
WHERE A.date_returned = NULL
GROUP BY  A.memberID
ORDER BY last_name ASC;

это ошибка, которую я получаю:

Msg 8120, Level 16, State 1, Line 253
Column 'RENT.dvdID' is invalid in the select list because it is not           
contained in either an aggregate function or the GROUP BY clause.

где я делаю не так?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Вы должны написать запрос как:

SELECT r.memberID,
       m.first_name, m.last_name, r.branchID,
       COUNT(r.dvdID) AS "Total DVDs Borrowed"
FROM RENT r JOIN
     MEMBER m
     ON m.memberID = r.memberID
WHERE r.date_returned IS NULL
GROUP BY r.memberID, m.first_name, m.last_name, r.branchID
ORDER BY last_name ASC;

Примечания:

  • Все неагрегированные столбцы в SELECT должны быть в GROUP BY (это ваша явная ошибка).
  • Псевдонимы таблиц должны представлять таблицы, которые они представляют, а не произвольные буквы.
  • Используйте только одинарные кавычки для констант строки и даты. Не используйте их для псевдонимов столбцов.
  • DVDid не имеет смысла в SELECT (ваш запрос их учитывает), поэтому я удалил его.
  • = NULL фильтрует все строки. Правильный синтаксис SQL: IS NULL.
0 голосов
/ 28 июня 2018

Еще одна альтернатива группировке - предварительно запросить количество невозвращенных арендных плат и присоединить его к списку участников.

select
      m.first_name AS 'FIRST NAME',
      m.last_name AS 'LAST NAME',
      r.BranchID as 'BRANCH ID',
      r.DVDsBorrowed as 'Total DVDs Borrowed'
   from
      ( select MemberID, 
               BranchID, 
               count(*) DVDsBorrowed
           from 
              rent
           WHERE 
              date_returned IS NULL
           group by 
              MemberID, 
              BranchID ) r
         JOIN Member m
            on r.MemberID = m.MemberID

если у вас действительно есть дополнительная таблица поиска ветвей и вы хотите это описание, вы можете просто добавить что-то похожее на объединение и добавить заголовок ветки в список полей

   JOIN Branch b
      on r.BranchID = b.BranchID
0 голосов
/ 28 июня 2018

Если столбец в списке выбора отсутствует в предложении group by, вы можете использовать его только в статистической функции. Если вы все еще хотите, чтобы счет вместе с dvdID вместе, используйте предложение Partition By, предполагая, что вы используете sql-сервер.

SELECT A.dvdID  AS 'DVD ID',
A.memberID AS 'MEMBER ID',
B.first_name AS 'FIRST NAME',
B.last_name AS 'LAST NAME',
A.branchID AS 'BRANCH ID',
COUNT(A.dvdID) OVER (PARTITION BY A.memberID) AS 'Total DVDs Borrowed'
FROM RENT A
JOIN MEMBER B ON (B.memberID = A.memberID)
WHERE A.date_returned = NULL
ORDER BY last_name ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...