2015-09-07 2 views
1

У меня есть таблица продаж sale со следующими столбцамиНайти среднее количество строк из общего количества

sale_id | Отдел | gross_amount

Мне нужно найти СРЕДНЕМ продаж в каждом отделении от общей продажи

например: - Таблица

sale_id  Department  gross_amount 
    1   A    10 
    2   B    30 
    3   A    25 
    4   c    5 

Desired output 

Department    Gross_amount  avg 
    A       35   50  --(35/70)*100 
    B       30   42.86 --(30/70)*100 
    C       5    7.14  --(5/70) *100 

т.е. является dept_avg = (dept_total/всего) * 100 например: - dept_total of A = 35 total = A + B + C = 35 + 30 + 5 = 70

Я могу найти до Gross_amount

select Department ,sum(si.GrossPrice) gross_amt 
from Sale si 
group by Department 
order by Department 

Для получения СРЕДНЕМ я пытался следовать

select Department ,sum(si.GrossPrice) gross_amt, 
    AVG(sum(si.GrossPrice)) avg 
    from Sale si 
    group by Department 
    order by Department 

Это дает мне ошибку

не может выполнить агрегатную функцию на выражении, содержащем агрегат или подзапрос.

Также я не уверен, что могу получить ожидаемую аверсию с вышеуказанным запросом. Как я могу достичь того же.

+0

Вы можете исправить свой вопрос, чтобы использовать те же имена столбцов, где они идентичны, и объяснить, почему вы делите 100 раз все время? – Amit

+0

@Amit я отредактировал мой вопрос..divison на 100.0 делает, чтобы получить две десятичные точки в ответе ... я удалил это, чтобы избежать путаницы – Sachu

+0

Sachu, пожалуйста, не спешите ничего. Не торопитесь и решите: gross_amount, Gross_amount или GrossPrice? dept_avg или avg? Что такое dept_total? что общего? – Amit

ответ

2

Divide сгруппированных сумма на общую сумму:

SqlFiddleDemo

SELECT Department , 
    [Gross_amount] = SUM(gross_amount), 
    [avg] = ROUND(CAST(SUM(gross_amount) AS DECIMAL(10,2))/ 
        CAST((SELECT SUM(gross_amount) FROM tab) AS DECIMAL(10,2)) * 100 
      ,2) 
FROM tab 
GROUP BY Department 
ORDER BY Department 
+0

скрипка работает нормально, так как мой желаемый выход ... но когда я применяю в своей таблице, я получаю «Ошибка арифметического переполнения, конвертирующую int в тип данных числовой». Ошибка – Sachu

+0

@Sachu Измените на 'DECIMAL (10, 2)' и повторите попытку. Я обновил свой ответ. – lad2025

+0

спасибо .. ответ. .. – Sachu

0

Если вы хотите, доля от общего числа для каждого отдела из их общего количества, я предложил бы использовать оконные функции:

SELECT Department, SUM(gross_amount) as gross_amount 
     SUM(gross_amount)*100.0/SUM(SUM(gross_amount)) over() as propotion 
FROM tab 
GROUP BY Department 
ORDER BY Department; 
+0

gud suggestion, но я не могу использовать round или Convert (десятичный (10,2) с окном над function.it дает ошибку – Sachu

+0

@Sachu. Это должно быть неуместно. Вероятно, у вас есть ошибка в вашем синтаксисе. –

Смежные вопросы