SQL процент от средних

У меня есть таблица SQL Server Table_1 с name, subname, value столбцами

Для каждого подимени я могу получить среднее значение по запросу:

select subname, AVG(value) as avg from Table_1 group by subname;

Я также могу получить сумму значений для каждого имени:

select name, sum(value) as sum from Table_1 group by name;

Мне нужен процент каждой строки avg для каждой из name, я не могу понять это.

РЕДАКТИРОВАТЬ: например. процентов будет -- среднее значение1 равно x% от общего числа средних значений в a1

select * from Table_1 выглядит так:

name subname value  
a1  val1    20  
a1  val2    20  
a1  val3    10  
a1  val1    40  
a1  val2    30  
a2  2val3   90   
a2  2val1   80  
a2  2val2   30  
a2  2val3   90   
a2  2val1   80  
a2  2val1   630  

person heyNow    schedule 23.02.2012    source источник
comment
Как должен выглядеть вывод?   -  person Andriy M    schedule 23.02.2012
comment
Я думаю, что они на самом деле спрашивают, как должны выглядеть выходные данные в виде данных?, а не имена столбцов.   -  person Seph    schedule 23.02.2012
comment
в этом случае в a1 среднее значение val1 равно 30, среднее значение val2 равно 25, среднее значение val3 равно 10. Таким образом, проценты равны val1 = 30/(30+25+10) = 46%. Таким образом, результат показывает - a1 val1 46 .. и так далее   -  person heyNow    schedule 23.02.2012


Ответы (1)


WITH data (name, subname, value) AS (
  SELECT 'a1',  'val1 ',   20  UNION ALL
  SELECT 'a1',  'val2 ',   20  UNION ALL
  SELECT 'a1',  'val3 ',   10  UNION ALL
  SELECT 'a1',  'val1 ',   40  UNION ALL
  SELECT 'a1',  'val2 ',   30  UNION ALL
  SELECT 'a2',  '2val3',   90  UNION ALL 
  SELECT 'a2',  '2val1',   80  UNION ALL
  SELECT 'a2',  '2val2',   30  UNION ALL
  SELECT 'a2',  '2val3',   90  UNION ALL 
  SELECT 'a2',  '2val1',   80  UNION ALL
  SELECT 'a2',  '2val1',   630  
)
SELECT
  name,
  subname,
  percentage = AVG(value) * 100 / SUM(AVG(value)) OVER (PARTITION BY name)
FROM data
GROUP BY
  name,
  subname
;

Выход:

name subname percentage
---- ------- -----------
a1   val1    46
a1   val2    38
a1   val3    15
a2   2val1   68
a2   2val2   7
a2   2val3   23

Полезное чтение:

person Andriy M    schedule 23.02.2012
comment
эй! это какой-то сложный SQL для SQL-n00b вроде меня, но он работает! - person heyNow; 23.02.2012
comment
@heyNow: агрегированные оконные функции часто могут быть очень удобными. И я думаю, что их не так уж сложно понять! Для начала взгляните на страницу руководства OVER Clause (ссылка в моем обновленном ответе). - person Andriy M; 23.02.2012