2 votes

Comment calculer la moyenne si l'on utilise SUM

J'essaie d'écrire une requête qui renvoie le pourcentage total moyen en utilisant toutes les lignes de pourcentage.

J'ai des difficultés à calculer le pourcentage moyen total à l'aide de la fonction AVG car le champ transmis utilise une autre fonction SUM qui calcule le pourcentage par ligne.

Ejemplo:

SELECT 
-- Row Percent Value
CONVERT(DECIMAL(5,4), 1.0 * SUM([col1]+[col2]+[col3]+[col4]+[col5]) / SUM([total])) AS 'Percent Row',
-- total rows average percent -- This part does not work
AVG(CONVERT(DECIMAL(5,4), 1.0 * SUM(CASE WHEN [col0] = 'Y' THEN [total] ELSE 0 END) / SUM([total])))

Je reçois un message d'erreur :

Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

J'apprécierais toute aide sur la façon de contourner ce problème, tout commentaire est le bienvenu.

UPDATE

Voici ma requête actuelle (sans la moyenne)

SELECT  
'Totals', 
CAST(CAST(SUM(CASE WHEN Gender = 'F' THEN Total ELSE 0 END) AS DECIMAL) / CAST(SUM(Total) AS DECIMAL) AS FLOAT) AS 'OA F' 
FROM RecordCount rc WITH(NOLOCK)
INNER JOIN Record r WITH(NOLOCK) 
    ON r.RecordId = rc.RecordId
WHERE 
    (rc.RecordId IN ('00001','00002'));

La moyenne doit être incluse dans une autre colonne, juste après 'OA F'. C'est la requête qui permet d'obtenir la moyenne et je ne sais pas comment l'introduire correctement dans la requête existante, principalement parce qu'elle utilise d'abord la fonction SUM, puis la AVG :

SELECT AVG(o.[Avg%]) 
FROM 
(
    SELECT CAST(SUM(i.bnh + i.aa + i.[pi] + i.h + i.tmr)) AS DECIMAL)/ SUM(i.total) as [Avg%]
    FROM rc i
) AS o

Toute aide est la bienvenue.

1voto

Daniel Marcus Points 2408

Passez à un niveau supérieur :

select [percent row], avg(a) from(
SELECT 
CONVERT(DECIMAL(5,4), 1.0 * SUM([col1]+[col2]+[col3]+[col4]+[col5]) / SUM([total])) AS 'Percent Row', 
CONVERT(DECIMAL(5,4), 1.0 * SUM(CASE WHEN [col0] = 'Y' THEN [total] ELSE 0 END) / SUM([total])) a
from yourtable)b
group by [percent row]

0voto

D T Points 1206

Essayez ceci...

SELECT 'Percent Row', Avg(col2) 
FROM   (SELECT 
       -- Row Percent Value 
       CONVERT(DECIMAL(5, 4), 1.0 * Sum([col1] + [col2] + [col3] + [col4] + [col5]) / Sum([total]))  AS 'Percent Row', 
       -- total rows average percent -- This part does not work 
       CONVERT(DECIMAL(5, 4), 1.0 * Sum(CASE 
                                          WHEN [col0] = 'Y' THEN [total] 
                                          ELSE 0 
                                        END) / Sum([total])) AS Col2) SQ 

Ou ceci...

;WITH cte 
     AS (SELECT 
        -- Row Percent Value  
        CONVERT(DECIMAL(5, 4), 1.0 * Sum([col1] + [col2] + [col3] + [col4] + [col5]) / Sum([total])) AS 'Percent Row', 
        -- total rows average percent -- This part does not work  
        CONVERT(DECIMAL(5, 4), 1.0 * Sum(CASE 
                                           WHEN [col0] = 'Y' THEN [total] 
                                           ELSE 0 
                                         END) / Sum([total])) AS Col2)

SELECT 'Percent Row', Avg(col2) 
FROM   cte

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X