2010-03-15 4 views
3

J'ai une table avec 3 colonnes (smallint) dans SQL Server 2005.moyenne Obtenir de 3 colonnes dans SQL Server

Table Ratings 
ratin1 smallint, 
ratin2 smallint 
ratin3 smallint 

Ces colonnes peuvent avoir des valeurs 0-5.

Comment puis-je sélectionner la valeur moyenne de ces champs, mais ne comparer que les champs dont la valeur est supérieure à 0.

Donc, si les valeurs de la colonne sont 1, 3, 5 - la moyenne doit être 3. si les valeurs sont 0, 3, 5 - La moyenne doit être 4.

+0

Quelle est la moyenne lorsque les trois sont 0? –

+0

Pour clarifier - vous voulez trouver la moyenne de ratin1, ratin2, et ratin3 dans une seule rangée, non? – mwigdahl

+0

si tous sont 0 alors je dois obtenir 0 – barbarian

Répondre

9

C'est un peu rapide et sale, mais il fonctionnera ...

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 
+0

lorsque les trois sont 0, vous obtiendrez la division par zéro, n'est-ce pas? –

+0

+ (cas où ratin 1 = 0 et ratin2 = 0 et ratin3 = 0 alors 1 autre 0 fin) –

+0

Merci, c'est vrai! Réponse modifiée – mwigdahl

-2

Vous pouvez utiliser la fonction AVG(). Cela obtiendra la moyenne pour une colonne. Vous pouvez donc imbriquer une instruction SELECT avec les méthodes AVG(), puis sélectionner ces valeurs.

Pseudo:

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

Je ne pense vraiment pas que c'est ce que le questionneur veut. Comme je l'ai lu, il veut faire la moyenne de ratin1, ratin2 et ratin3 dans le contexte d'une seule ligne. – mwigdahl

+0

Si c'est le cas, ils peuvent simplement modifier la première instruction SELECT pour dire SELECT AVG (col1 + col2 + col3) –

+0

'AVG (col1 + col2 + col3)' est la somme de col1, col2 et col3 pour single –

0

C'est plus délicat qu'il n'y paraît, mais vous pouvez le faire:

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

Si vous créez cette fonction première:

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 
1

@mwigdahl - cela casse si l'une des valeurs est NULL. Utilisez la NVL (valeur par défaut) pour éviter ceci:

Sum columns with null values in oracle

Edit: Cela ne fonctionne que dans Oracle. Dans TSQL, essayez d'encapsuler chaque champ avec une instruction ISNULL().

-1
select 
(
    select avg(v) 
    from (values (Ratin1), (Ratin2), (Ratin3)) as value(v) 
) as average 
Questions connexes