Как рассчитать среднее значение, если используется SUM - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь написать запрос, который возвращает общий процент в процентах, используя все строки процентов.

У меня проблемы с вычислением общего среднего процента с использованием функции AVG, поскольку в переданном поле используется другая функция SUM, которая рассчитывает процент в строке.

Пример:

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])))

Я получаю сообщение об ошибке:

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

Буду признателен за любую помощь, как обойти это, любая оценка очень ценится,

ОБНОВЛЕНИЕ

Это мой текущий запрос (без среднего)

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'));

Среднее должно быть включено в другой столбец сразу после«OA F», это запрос, который получает среднее значение, и я не уверен, как правильно ввести существующий запрос, главным образом потому, что он использует сначала функцию SUM, а затем 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

Любая помощь очень ценит это.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Попробуйте это ...

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 

Или это ...

;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 
0 голосов
/ 11 мая 2018

Поднимитесь на уровень:

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