Как написать запрос, чтобы посчитать процент от суммы записей группы?
Нужно написать запрос, который бы выводил: country_id , user_id и долю от дохода, полученную со страны регистрации пользователя ( country_id ): Пример вывода:
country_id user_id percent RU 12 6.33 BY 112 1.11 RU 632 2.51 UA 231 4.65
Отслеживать
Андрей Моциевич
задан 5 июн 2021 в 10:30
Андрей Моциевич Андрей Моциевич
11 1 1 серебряный знак 6 6 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вот этот запрос соответствует задаче
SELECT u.id, ROUND((o.amount_usd /SUM(o.amount_usd) OVER (PARTITION BY u.country_id))* 100,2) AS percent FROM users u JOIN orders o ON o.user_id = user_id GROUP BY u.id, u.country_id;
Отслеживать
ответ дан 6 июн 2021 в 14:39
Андрей Моциевич Андрей Моциевич
11 1 1 серебряный знак 6 6 бронзовых знаков
- sql
- таблицы
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как посчитать процент от общего количества записей mysql?
Таблица Addresses (id_address,region,status)
SELECT count(*),addresses.region FROM addresses GROUP BY region — данным запросом я считаю общее количество адресов по регионам.
Как посчитать в одном запросе сколько процентов из этих адресов имею status = 5?
в итоге что то типа этого
Регион —- 10000 адресов— 90% статус 5
- Вопрос задан более трёх лет назад
- 9420 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 2
SELECT COUNT(*)/(SELECT COUNT(*) FROM addresses)*100 AS percent FROM addresses WHERE status=5
Ответ написан более трёх лет назад
Как посчитать процент в sql
Регистрация: 15.04.2010
Сообщений: 98
Посчитать проценты в MySQL
Здравствуйте. Есть таблица со списком посетителей с указанием стран, откуда они пришли. Нужно вывести кол-во посетителей по каждой из стран (численно и в процентах). Можно ли сделать это одним запросом?
SELECT COUNT(*) AS `count`, `count` / общее_кол-во_строк * 100 AS `percent` FROM `visitors` GROUP BY `country`
| CraZZZy-GameRRR |
| Посмотреть профиль |
| Найти ещё сообщения от CraZZZy-GameRRR |
Как посчитать процент в sql
Есть у меня БД на PostgreSQL 7.4.
Таблица вида
period ip traf
timestamp inet integer
Period — означает конец периода, за который собрана статистика, traf _
число байт. Все собирается раз в час
Хочу агрегировать по месяцам. Пишу
select date_trunc(‘month’, period) as mon, sum(traf)
where ip =
group by mon
order by mon
Все работает.
Теперь хочу там же получить процент использования трафика от общего за
каждый месяц. Пытаюсь написать
select date_trunc(‘month’, period) as mon, sum(traf),
traf / (select sum(traf) where date_trunc(‘month’, period) = mon)
where ip =
group by mon
order by mon
Не работает, пишет, что «ERROR: column «mon» does not exist». Вроде как
в списке выборки действительно нельзя использовать алиасы.
Но как добиться желаемого эффекта?
—
Константин Стефанов
Andrei N. Sobchuck
2004-08-25 15:22:31 UTC
Constantin Stefanov <***@mail.ru>wrote:
CS> Теперь хочу там же получить процент использования трафика от общего за
CS> каждый месяц. Пытаюсь написать
CS> select date_trunc(‘month’, period) as mon, sum(traf),
CS> traf / (select sum(traf) where date_trunc(‘month’, period) = mon)
CS> where ip =
CS> group by mon
CS> order by mon
CS> Не работает, пишет, что «ERROR: column «mon» does not exist». Вроде как
CS> в списке выборки действительно нельзя использовать алиасы.
CS> Но как добиться желаемого эффекта?
У тебя sum(traf) — это трафик за месяц, который равен
(select sum(traf) where date_trunc(‘month’, period) = mon).
просто «traf» в формуле, афаик недопустимо (бессмысленно).
если нужно найти сколько процентов съедено за 1 мес,
от общего трафика, то
select date_trunc(‘month’, period) as mon, sum(traf),
sum(traf) / (select sum(traf) from your_tbl)
from your_tbl
where ip =
group by mon
order by — не нужен.
Если интересует процент не от всей суммы, а за период, то тебе
нужно две группировки, например так:
select date_trunc(‘year’,period), date_trunc(‘month’, period),
sum(traf),
sum(traf) /
(select sum(y2.traf)
from your_tbl y2
where date_trunc(‘year’,y2.period) = date_trunc(‘year’,y1.period)
AND y2.ip = y1.ip)
from your_tbl y1
where ip =
Что то в этом духе 🙂
—
Andrei N.Sobchuck
JabberID: ***@jabber.ru. ICQ UIN: 46466235.
Отправлено через сервер Форумы@mail.ru — http://talk.mail.ru
Constantin Stefanov
2004-08-26 08:17:32 UTC
Post by Andrei N. Sobchuck
У тебя sum(traf) — это трафик за месяц, который равен
(select sum(traf) where date_trunc(‘month’, period) = mon).
просто «traf» в формуле, афаик недопустимо (бессмысленно).
если нужно найти сколько процентов съедено за 1 мес,
от общего трафика, то
select date_trunc(‘month’, period) as mon, sum(traf),
sum(traf) / (select sum(traf) from your_tbl)
from your_tbl
where ip =
group by mon
Это всего, а мне нужно с разбивкой по месяцам. Так, очевидно, работает.
Post by Andrei N. Sobchuck
Если интересует процент не от всей суммы, а за период, то тебе
select date_trunc(‘year’,period), date_trunc(‘month’, period),
sum(traf),
sum(traf) /
(select sum(y2.traf)
from your_tbl y2
where date_trunc(‘year’,y2.period) = date_trunc(‘year’,y1.period)
AND y2.ip = y1.ip)
from your_tbl y1
where ip =
Так не работает. Пишет «ERROR: column «y1.period» must appear in the
GROUP BY clause or be used in an aggregate function»
При попытке добавить группировку group by date_trunc(‘month’, period)
(кстати, первый date_trunc тут лишний, эта функция обрезает дату, а не
выделяет один элемент, после нее год тоже остается) появляется другая
ошибка: «ERROR: subquery uses ungrouped column «acc_1.period_end» from
outer query».
То есть не видит он, что мы используем выражение, по которому идет
группировка.
—
Константин Стефанов
Andrei N. Sobchuck
2004-08-26 08:45:22 UTC
Post by Andrei N. Sobchuck
У тебя sum(traf) — это трафик за месяц, который равен
(select sum(traf) where date_trunc(‘month’, period) = mon).
просто «traf» в формуле, афаик недопустимо (бессмысленно).
если нужно найти сколько процентов съедено за 1 мес,
от общего трафика, то
select date_trunc(‘month’, period) as mon, sum(traf),
sum(traf) / (select sum(traf) from your_tbl)
from your_tbl
where ip =
group by mon
CS> Это всего, а мне нужно с разбивкой по месяцам. Так, очевидно, работает.
Это и есть разбивка по месяцам («group by mon»).
(См. следующие две строчки)
Post by Andrei N. Sobchuck
Если интересует процент не от всей суммы, а за период, то тебе
select date_trunc(‘year’,period), date_trunc(‘month’, period),
sum(traf),
sum(traf) /
(select sum(y2.traf)
from your_tbl y2
where date_trunc(‘year’,y2.period) = date_trunc(‘year’,y1.period)
AND y2.ip = y1.ip)
from your_tbl y1
where ip =
CS> Так не работает. Пишет «ERROR: column «y1.period» must appear in the
CS> GROUP BY clause or be used in an aggregate function»
Я забыл в конце дописать [эти самые две группировки]:
group by date_trunc(‘year’,period), date_trunc(‘month’, period)
CS> При попытке добавить группировку group by date_trunc(‘month’, period)
CS> (кстати, первый date_trunc тут лишний, эта функция обрезает дату, а не
CS> выделяет один элемент, после нее год тоже остается) появляется другая
CS> ошибка: «ERROR: subquery uses ungrouped column «acc_1.period_end» from
CS> outer query».
Ммм. Не понятно что acc_1.period_end (твои реальные имена видимо),
но скорее всего, опять же, потому что я забыл группировку дописать.
Первая функция может и лишняя в выборке, но группировка по ней
должна быть обязательно, если хочешь её использовать в качестве условия
в подзапросе.
CS> То есть не видит он, что мы используем выражение, по которому идет
CS> группировка.
—
Andrei N.Sobchuck
JabberID: ***@jabber.ru. ICQ UIN: 46466235.
Отправлено через сервер Форумы@mail.ru — http://talk.mail.ru
Constantin Stefanov
2004-08-26 10:04:00 UTC
Post by Constantin Stefanov
select date_trunc(‘month’, period) as mon, sum(traf),
sum(traf) / (select sum(traf) from your_tbl)
from your_tbl
where ip =
group by mon
CS> Это всего, а мне нужно с разбивкой по месяцам. Так, очевидно, работает.
Это и есть разбивка по месяцам («group by mon»).
(См. следующие две строчки)
Ну да, только процент будет не от текущего месяца, а от всего периода
наблюдений. Это не то, что нужно.
Post by Constantin Stefanov
Если интересует процент не от всей суммы, а за период, то тебе
select date_trunc(‘year’,period), date_trunc(‘month’, period),
sum(traf),
sum(traf) /
(select sum(y2.traf)
from your_tbl y2
where date_trunc(‘year’,y2.period) = date_trunc(‘year’,y1.period)
AND y2.ip = y1.ip)
from your_tbl y1
where ip =
CS> Так не работает. Пишет «ERROR: column «y1.period» must appear in the
CS> GROUP BY clause or be used in an aggregate function»
group by date_trunc(‘year’,period), date_trunc(‘month’, period)
CS> При попытке добавить группировку group by date_trunc(‘month’, period)
CS> (кстати, первый date_trunc тут лишний, эта функция обрезает дату, а не
CS> выделяет один элемент, после нее год тоже остается) появляется другая
CS> ошибка: «ERROR: subquery uses ungrouped column «acc_1.period_end» from
CS> outer query».
Ммм. Не понятно что acc_1.period_end (твои реальные имена видимо),
Ну да, должно быть y1.period. Просто переобозначено.
Post by Andrei N. Sobchuck
но скорее всего, опять же, потому что я забыл группировку дописать.
Первая функция может и лишняя в выборке, но группировка по ней
должна быть обязательно, если хочешь её использовать в качестве условия
в подзапросе.
Вот смотри.
select date_trunc(‘month’, y1.period) as mon,
sum(traf),
sum(traf) /
(select sum(y2.traf) from tbl y2
where date_trunc(‘month’, y1.period) = date_trunc(‘month’, y2.period)
)
from tbl y1
where ip = »
group by date_trunc(‘month’, y1.period)
Получаем ошибку «ERROR: subquery uses ungrouped column «y1.period» from
outer query»
То есть выражение в группировке-то есть, но он не разрешает его в
подзапросе.
—
Константин Стефанов
Andrei N. Sobchuck
2004-08-26 15:29:47 UTC
Post by Andrei N. Sobchuck
Это и есть разбивка по месяцам («group by mon»).
(См. следующие две строчки)
CS> Ну да, только процент будет не от текущего месяца, а от всего периода
CS> наблюдений. Это не то, что нужно.
Похоже я чего-то не допонимаю.
То что, привёл я высчитывает, какой процент составляет
трафик за месяц в общем трафике (за период наблюдения)
по конкретному ип-адресу.
Возможно тебе нужно высчитать вес, который имеет трафик
по конкретному ип в трафике по всем ип за месяц.
Тогда действительно такой запрос:
CS> select date_trunc(‘month’, y1.period) as mon,
CS> sum(traf),
CS> sum(traf) /
CS> (select sum(y2.traf) from tbl y2
CS> where date_trunc(‘month’, y1.period) = date_trunc(‘month’, y2.period)
CS> )
CS> from tbl y1
CS> where ip = »
CS> group by date_trunc(‘month’, y1.period)
CS> Получаем ошибку «ERROR: subquery uses ungrouped column «y1.period» from
CS> outer query»
Гм. И действительно. Как по мне, то это бага.
Тогда так:
select tot.mon, con.s, con.s/tot.s
from
(select date_trunc(‘month’, period) as mon, sum(traf) as s
from tbl
group by mon) tot,
(select date_trunc(‘month’, period) as mon, sum(traf) as s
from tbl where ip = <. >
group by mon) con
where tot.mon = con.mon
—
Andrei N.Sobchuck
JabberID: ***@jabber.ru. ICQ UIN: 46466235.
Отправлено через сервер Форумы@mail.ru — http://talk.mail.ru
Constantin Stefanov
2004-08-27 07:42:34 UTC
Post by Andrei N. Sobchuck
Гм. И действительно. Как по мне, то это бага.
select tot.mon, con.s, con.s/tot.s
from
(select date_trunc(‘month’, period) as mon, sum(traf) as s
from tbl
group by mon) tot,
(select date_trunc(‘month’, period) as mon, sum(traf) as s
from tbl where ip = <. >
group by mon) con
where tot.mon = con.mon
Ну да, два подзапроса и соединение. Я в итоге так и сделал, только
хотелось разобраться, почему с подзапросом в select list не работает.
Видимо, действительно баг. Ладно, обновлю postgres и, если не починили,
буду писать баг-репорт.
Спасибо за помощь.
