Getting average of 3 columns in SQL Server

I have a table with 3 columns ( smallint) in SQL Server 2005.

Table Ratings
ratin1 smallint,
ratin2 smallint
ratin3 smallint

These columns can range from 0to 5.

How can I choose the average value of these fields, but only compare the fields where the value is greater than 0.

So, if the value of the column 1, 3, 5- the mean value must be 3. if the values of 0, 3, 5- the mean value must be 4.

+3
source share
6 answers

It is rather quick and dirty, but it will work ...

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
+9
source

@mwigdahl - , NULL. NVL (, ), :

: Oracle. TSQL ISNULL().

+1

, , :

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
select 
(
    select avg(v) 
    from (values (Ratin1), (Ratin2), (Ratin3)) as value(v)
) as average
-1

AVG(). . , SELECT AVG(), .

:

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.
-2

Source: https://habr.com/ru/post/1737022/


All Articles