2014-02-12 3 views
0

Результаты поиска, которые я нашел, во многом отличались от того, что я пытаюсь сделать. Я почти уверен, что я снова думаю о вещах. Любая помощь или указатели будут оценены. Я использую mssql и sql server 2012SQL AVG в подзапросе - результат: «Подзапрос возвратил более 1 значения ..»

У меня есть таблица с тремя столбцами - document_id, member_id и рейтинг. Я хотел бы оценить рейтинги для всех соответствующих документов в таблице.

enter image description here

Вот вся процедура - но я остановлюсь на грязной части после блока:

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 

ответ

0

Ваша проблема заключается не в @avg_rating. Это @member_rating. Этот подзапронт:

 @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 

Это может вернуть более одного значения. Вероятно, вы также захотите avg() в этом подзапросе.

Ваш запрос @avg_rating в порядке. Это запрос агрегирования, который возвращает одну строку, потому что есть avg() в заявлении select и не оговорке group by. Он будет возвращать одну строку и одно значение, что и должен делать подзапрос.

+0

Второй набор глаз действительно полезен иногда. Спасибо, что указали это, это была ошибка в подзапросе. Мне нужно было добавить дополнительное ограничение в инструкции «where» и добавить дополнительный параметр в процедуру. Отредактировал мой вопрос. Решено. еще раз спасибо – apoji187

0

Лично я бы не использовал подзапросы, так как у вас есть одно и то же условие 3 раза, но вместо этого используйте Left external join document_rating на document.document_id = document_rating.document_id Это означает, что вы получаете все строки предыдущего запроса и рейтинги, с нулевым рейтингом, где нет рейтинга Затем Группа по документу_ид (рейтинг)

Это также должно улучшить производительность.

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