Получение среднего из 3 столбцов в SQL Server - PullRequest
3 голосов
/ 15 марта 2010

У меня есть таблица с 3 столбцами (smallint) в SQL Server 2005.

Table Ratings
ratin1 smallint,
ratin2 smallint
ratin3 smallint

Эти столбцы могут иметь значения от 0 до 5.

Как выбрать среднее значение этих полей, но сравнивать только те поля, где значение больше 0.

То есть, если значения столбцов 1, 3, 5 - среднее значение должно составлять 3. если значения 0, 3, 5 - среднее значение должно быть 4.

Ответы [ 6 ]

9 голосов
/ 15 марта 2010

Это быстро и грязно, но это будет работать ...

SELECT (ratin1 + ratin2 + ratin3) / 
((CASE WHEN ratin1 = 0 THEN 0 ELSE 1 END) + 
(CASE WHEN ratin2 = 0 THEN 0 ELSE 1 END) + 
(CASE WHEN ratin3 = 0 THEN 0 ELSE 1 END) +
(CASE WHEN ratin1 = 0 AND ratin2 = 0 AND ratin3 = 0 THEN 1 ELSE 0 END) AS Average
1 голос
/ 24 марта 2012

@ mwigdahl - разрывается, если любое из значений равно NULL. Используйте NVL (значение по умолчанию), чтобы избежать этого:

Сумма столбцов с нулевыми значениями в Oracle

Редактировать: Это работает только в Oracle. В TSQL попробуйте инкапсулировать каждое поле с помощью оператора ISNULL().

0 голосов
/ 20 апреля 2017
select 
(
    select avg(v) 
    from (values (Ratin1), (Ratin2), (Ratin3)) as value(v)
) as average
0 голосов
/ 15 марта 2010

Это сложнее, чем кажется, но вы можете сделать это:

SELECT dbo.MyAvg(ratin1, ratin2, ratin3) from TableRatings

Если вы сначала создадите эту функцию:

CREATE FUNCTION [dbo].[MyAvg]
(
    @a int,
    @b int,
    @c int
)
RETURNS int
AS
BEGIN
    DECLARE @result int
    DECLARE @divisor int
    SELECT @divisor = 3

    IF @a = 0 BEGIN SELECT @divisor = @divisor - 1 END
    IF @b = 0 BEGIN SELECT @divisor = @divisor - 1 END
    IF @c = 0 BEGIN SELECT @divisor = @divisor - 1 END

    IF @divisor = 0     
        SELECT @result = 0
    ELSE
        SELECT @result = (@a + @b + @c) / @divisor

    RETURN @Result

END
0 голосов
/ 15 марта 2010

Вы можете использовать функцию AVG (). Это получит среднее значение для столбца. Таким образом, вы можете вложить инструкцию SELECT с помощью методов AVG (), а затем SELECT эти значения.

Псевдо:

SELECT col1, col2, col3
  FROM (
    SELECT AVG(col1) AS col1, AVG(col2) AS col2, AVG(col3) AS col3
      FROM table
) as tbl
WHERE col1 IN (0, 3, 5)
etc.
0 голосов
/ 15 марта 2010

Должна быть агрегированная средняя функция для сервера sql.

http://msdn.microsoft.com/en-us/library/ms177677.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...