Заставьте AVG возвращать 0 вместо NULL при предварительном формировании пустого набора в SQL Server 2008 - PullRequest
3 голосов
/ 12 марта 2012

У меня есть две таблицы, называемые Обзоры и Уровни.

CREATE TABLE [dbo].[Reviews](
    [ReviewID] [int] IDENTITY(1,1) NOT NULL,
    [Rating] [float] NOT NULL,
    [LevelID] [int] NOT NULL,

CREATE TABLE [dbo].[Levels](
    [Name] [varchar](50) NOT NULL,
    [Blocks] [char](960) NOT NULL,
    [LevelID] [int] IDENTITY(1,1) NOT NULL,

Я хочу иметь возможность выбрать в основном таблицу уровней с дополнительным столбцом, который будет являться средним значением всех обзоров, связанных с этим LevelID. В настоящее время у меня есть этот код

SELECT   AVG(Rating) AS Average, Name,Levels.LevelID,Blocks
FROM     Reviews, Levels
WHERE    Levels.LevelID = Reviews.LevelID
GROUP BY Levels.LevelID, Name, Blocks

Возвращает правильные результаты для уровней, которые имеют хотя бы один обзор. Я хочу иметь возможность возвращать уровни, которые также не имеют обзора и просто дают средний рейтинг 0.

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Попробуйте с помощью этого запроса ... он определенно решит вашу проблему ....

SELECT ISNULL(AVG(Rating),0) AS Average, Name,Levels.LevelID,Blocks
FROM Levels LEFT JOIN Reviews
ON Levels.LevelID = Reviews.LevelID
GROUP BY Levels.LevelID, Name, Blocks
0 голосов
/ 12 марта 2012
SELECT   AVG(Rating) AS Average, Name, Levels.LevelID, Blocks
FROM     Reviews, Levels
WHERE    Levels.LevelID = Reviews.LevelID
GROUP BY Levels.LevelID, Name, Blocks
UNION
SELECT   0 AS Average, Name, LevelID, Blocks
FROM     Levels
WHERE    NOT EXISTS ( SELECT   * 
                      FROM     Reviews
                      WHERE    Levels.LevelID = Reviews.LevelID );
...