2015-04-04 2 views
0
SELECT * 
FROM Book b 
WHERE b.book_id IN (SELECT DISTINCT(c.book_id) 
        FROM Copy c 
        WHERE c.copy_id IN (SELECT copy_id 
             FROM Loan 
             WHERE Datediff(DAY, Getdate() - 180, loan_date) > 180) 
        GROUP BY c.copy_id 
        HAVING Count(copy_id) > 10) 

Когда я выполнил этот запрос, я попал ниже ошибки.Столбец недопустим в списке выбора

Колонка «Copy.Book_id» недопустима в списке выбора, потому что она не содержится ни в агрегатной функции, ни в предложении GROUP BY ».

+0

возможно дубликат [Что означает «недействительным, не содержится ни в агрегатной функции» сообщения означают] (HTTP : //stackoverflow.com/questions/18258704/what-does-the-invalid-not-contained-in-either-an-aggregate-function-message-m) – Tanner

ответ

0

Если вы хотите, чтобы иметь поле после selectselect в заявлении с group by части вы должны добавить свое название после того, как group by тоже и не использовать distinct ключевое слово, я думаю, что вам нужен код, как это:

SELECT c.book_id 
FROM Copy c 
WHERE c.copy_id IN (SELECT copy_id 
       FROM Loan 
       WHERE Datediff(DAY, Getdate() - 180, loan_date) > 180) 
GROUP BY c.book_id 
HAVING Count(copy_id) > 10 
0

Вы группируете c.copy_id, еще, вы хотите выбрать c.book_id. Это неверно. Вы могли бы рассмотреть один вариант из следующих:

  • group byc.book_id
  • group byc.book_id кроме того c.copy_id
  • не используют group by во внутреннем запросе
  • selectc.copy_id и использовать его во внешнем, а также выбрать

Я считаю, что очень первым вариант имеет наибольший смысл в этом случае.

0

Проблема вызывает ошибку в том, что вы группировать по ложному столбца в подзапросе, она должна быть b.book_id.

Тогда я думаю, что вы DateDiff сравнения может иметь даты в неправильном порядке (но это зависит от вашего намерения, и я, возможно, не понял, что вы пытаетесь сделать).

Так с изменениями, возможно, этот запрос может быть то, что вы ищете:

SELECT * FROM Book b 
WHERE b.Book_Id IN (
    SELECT c.Book_id 
    FROM Copy c 
    JOIN Loan l ON c.copy_id = l.copy_id 
    WHERE DATEDIFF(DAY, Loan_date, getdate()-180) > 180 
    GROUP BY c.Book_Id 
    HAVING COUNT(l.Copy_Id) > 10 
) 
Смежные вопросы

 Смежные вопросы