Как посчитать процент в sql
Перейти к содержимому

Как посчитать процент в sql

  • автор:

Как написать запрос, чтобы посчитать процент от суммы записей группы?

Нужно написать запрос, который бы выводил: 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

Stimulate

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 и, если не починили,
буду писать баг-репорт.

Спасибо за помощь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *