Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
Имеется таблица с сгруппированными данными.
Нужно посчитать процент каждой группы от суммы всех групп.
есть ограничения
1. Сделать все это одним запросом.
2. Подключить такую же таблицу, но агрегированную по всем группам (чтобы получить сумму всех) нельзя.

Что-то пару часов ломаю голову, но решения пока не вижу.
Исходная таблица
Name Value
Ivan100
Vlad150
Mark250


Хочется получить
Name Value Percent
Ivan10020
Vlad15030
Mark25050
17 июн 19, 14:20    [21909781]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 323
SQL2008,

WITH t ([NAME],[value])
	AS
	(
		SELECT 'ivan',100
		UNION ALL
		SELECT 'vlad',150
		UNION ALL
		SELECT 'mark',250
	)
	SELECT * ,
			t.[value] * 100 / SUM(t.[value]) OVER (PARTITION BY (SELECT 1))
	FROM t
17 июн 19, 14:34    [21909797]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
SQL2008,

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017
пример Е
только у тебя будет
SUM(Value) OVER(PARTITION BY (SELECT 1))
17 июн 19, 14:36    [21909801]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
Cristiano_Rivaldo
SQL2008,

WITH t ([NAME],[value])
	AS
	(
		SELECT 'ivan',100
		UNION ALL
		SELECT 'vlad',150
		UNION ALL
		SELECT 'mark',250
	)
	SELECT * ,
			t.[value] * 100 / SUM(t.[value]) OVER (PARTITION BY (SELECT 1))
	FROM t

Да, тоже уже сделал через CTE...
По другому не смог придумать.
17 июн 19, 14:49    [21909812]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
Спасибо всем откликнувшимся!
17 июн 19, 14:51    [21909817]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
SQL2008
Да, тоже уже сделал через CTE...
По другому не смог придумать.
select
 a.Name, a.Value, a.Value * 100 / b.total
from
 [Таблица] a cross join
 (select sum(Value) from [Таблица]) b(total)

Вариант через sum() over предпочтительнее.

ЗЫ: предложение partition by не нужно.
17 июн 19, 15:10    [21909855]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
Guf
SQL2008,

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017
пример Е
только у тебя будет
SUM(Value) OVER(PARTITION BY (SELECT 1))
А зачем там PARTITION ? Он, вообще-то, необязателен. Просто OVER()
17 июн 19, 15:18    [21909865]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
invm
SQL2008
Да, тоже уже сделал через CTE...
По другому не смог придумать.
select
 a.Name, a.Value, a.Value * 100 / b.total
from
 [Таблица] a cross join
 (select sum(Value) from [Таблица]) b(total)


Вариант через sum() over предпочтительнее.


Подключить такую же таблицу, но агрегированную по всем группам (чтобы получить сумму всех) нельзя.
17 июн 19, 16:22    [21909944]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
SQL2008
Подключить такую же таблицу, но агрегированную по всем группам
И где вы это увидели в предложенном запросе?
17 июн 19, 16:31    [21909959]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
invm
SQL2008
Подключить такую же таблицу, но агрегированную по всем группам
И где вы это увидели в предложенном запросе?



select sum(Value) from [Таблица]
17 июн 19, 16:42    [21909980]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
SQL2008,

Это запрос, а не агрегированная таблица.
17 июн 19, 16:45    [21909988]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
invm
SQL2008,

Это запрос, а не агрегированная таблица.

Возможно я не совсем корректно выразился.
Имелось в виду, что нельзя связать две одинаковые таблицы, так как ID у таблицы нет (увы, это так),
а полей, по которым данные можно точно сопоставить порядка 10. Если их все выводить в GROUP BY, то агрегированные данные рассыплются на более мелкие суммы.
Конечно можно все завернуть еще в один запрос с группировками, но этого сильно не хотелось.
Отсюда и "нельзя"
Вообще решение уже найдено, вопрос переходит в разряд академических.
17 июн 19, 16:49    [21910003]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать проценты после группировки для каждой группы от суммы всех групп  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
iap
А зачем там PARTITION ? Он, вообще-то, необязателен. Просто OVER()

Буду знать, спасибо.
18 июн 19, 04:52    [21910237]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить