Результаты поиска, которые я нашел, во многом отличались от того, что я пытаюсь сделать. Я почти уверен, что я снова думаю о вещах. Любая помощь или указатели будут оценены. Я использую mssql и sql server 2012SQL AVG в подзапросе - результат: «Подзапрос возвратил более 1 значения ..»
У меня есть таблица с тремя столбцами - document_id, member_id и рейтинг. Я хотел бы оценить рейтинги для всех соответствующих документов в таблице.
Вот вся процедура - но я остановлюсь на грязной части после блока:
select @title = title,
@description = document.[description],
@authors = authors,
@create_date = case when create_date is null then null else convert(varchar(10),create_date, 101) end,
@revision_date = case when revision_date is null then null else convert(varchar(10),revision_date, 101) end,
@file_format_id = document.file_format_id,
@document_category_id = document.document_category_id,
@size = [size],
@document_key = document_key,
@visibility = document.visibility,
@upload_member_id = upload_member_id,
@calculated_rating = case when document_category.allow_member_ratings = 1 then (select avg(convert(decimal,rating)) from document_rating where [document].document_id = document_rating.document_id) else null end,
@member_rating = case when (document_category.allow_member_ratings = 1) then (select convert(decimal,rating) from document_rating where [document].document_id = document_rating.document_id) else null end
from club.dbo.document
inner join club.dbo.document_category
on (document.document_category_id = document_category.document_category_id)
inner join club.dbo.file_format
on (document.file_format_id = file_format.file_format_id)
where document_id = @document_id
and document_category.club_id = @club_id
Та часть, которая дает мне ошибку в подзапрос для выходного параметра @calculated_rating ,
@calculated_rating = case when document_category.allow_member_ratings = 1
then (select avg(convert(decimal,rating))
from document_rating
where [document].document_id = document_rating.document_id)
else null end,
Приведенные выше результаты в «подзапрос возвращает более чем на 1 значение. Это не допускается, когда подзапрос следует =,! =, <,» Если document_id имеет более чем 1 запись рейтинга, процедурный бомбы. Очевидно, что сумма всех рейтингов для конкретного документа_ид не добавляется/усредняется.
Так что - я пытался что-то вроде этого:
@calculated_rating = case when document_category.allow_member_ratings = 1 then
(SELECT AVG(convert(decimal,document_rating.rating))
FROM(SELECT SUM(document_rating.rating) rating
FROM document_rating
WHERE [document].document_id = document_rating.document_id
GROUP BY document_rating.document_id) else null end,
Там в синтаксической ошибки там, потому что я напутал, - но я должен использовать псевдоним здесь? Является ли то, что я пытаюсь сделать, даже возможно?
Решенный
проблема не со средним - но с рейтингом члена. Необходимо добавить дополнительное ограничение для оператора where.
@member_rating = case when (document_category.allow_member_ratings = 1) then (select convert(decimal,rating) from document_rating where @member_id = document_rating.member_id and [document].document_id = document_rating.document_id) else null end
Второй набор глаз действительно полезен иногда. Спасибо, что указали это, это была ошибка в подзапросе. Мне нужно было добавить дополнительное ограничение в инструкции «where» и добавить дополнительный параметр в процедуру. Отредактировал мой вопрос. Решено. еще раз спасибо – apoji187