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

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

  • автор:

MySQL Как вычислить процент от общей суммы?

Имеется таблица зарплатной ведомости salary_statement в ней поля: worker — сотрудник, salary — оклад, как узнать процентную долю зарплаты каждого сотрудника, от общей суммы?

MySQL Зарплатная ведомость

0 Интересно

  • Саламов Игорь
  • 22. Сверхразум (163817)
  • 3 года

Модератор проекта Ноль вопросов!, также увлекаюсь программированием

Чтобы узнать процентную долю каждого оклада от общей суммы, необходимо выполнить следующий запрос:

SELECT salary / (SELECT SUM(salary) FROM salary_statement) * 100 AS percent FROM salary_statement;

В результате получим следующее:

MySQL процент от суммы

Если необходимо округлить получившиеся значения, то добавляем ещё функцию ROUND:

SELECT ROUND(salary / (SELECT SUM(salary) FROM salary_statement) * 100) AS percent FROM salary_statement

Получим следующий результат:

Посчитать процент значения одоной записи от суммы всех записей

Люди добрые, подскажите, кто сталкивался уже или знает решение.
Есть табличка продаж. К примеру:
помидоры — 20
огурцы — 30
яблоки — 50
Как без использования циклов, в операторе select напротив каждого наименования вывести процент продаж по нему от общей суммы?
То есть
помидоры — 20/100
огурцы — 30/100
яблоки — 50/100
Пробовала выкручивать агрегирующие функции, требует group by по названию, что убивает сам смысл суммы. Подзапросы тоже не помогают.
Есть какие-то варианты?

Добавлено через 28 минут
Плохой пример, извиняюсь.
Вот так лучше:
Группа -Наименов. — Количество
овощи — помидоры — 10
овощи — огурцы — 20
овощи — морковь — 50
фрукты — яблоко — 30
фрукты — слива — 70
В запросе показать:
овощи — помидоры — 10% от овощей
овощи — огурцы — 20% от овощей
овощи — морковь — 50% от овощей
фрукты — яблоко — 30% от фруктов
фрукты — слива — 70% от фруктов
Пробовала

select Группа, Количество/(select sum(Количество) from %Tablename% t1 where t1.Группа=t.Группа) from %Tablename% t

Ругается, что нельзя выбрать t.Группа потому что ее нет в предложении group by.

Арифметические функции

Для всех арифметических функций, тип результата вычисляется, как минимальный числовой тип, который может вместить результат, если такой тип есть. Минимум берётся одновременно по числу бит, знаковости и «плавучести». Если бит не хватает, то берётся тип максимальной битности.

SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0) 
┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐ │ UInt8 │ UInt16 │ UInt32 │ UInt64 │ └───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘ 

Арифметические функции работают для любой пары типов из UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64.

Переполнение производится также, как в C++.

plus(a, b), оператор a + b​

Вычисляет сумму чисел. Также можно складывать целые числа с датой и датой-с-временем. В случае даты, прибавление целого числа означает прибавление соответствующего количества дней. В случае даты-с-временем — прибавление соответствующего количества секунд.

minus(a, b), оператор a — b​

Вычисляет разность чисел. Результат всегда имеет знаковый тип.

Также можно вычитать целые числа из даты и даты-с-временем. Смысл аналогичен — смотрите выше для plus.

multiply(a, b), оператор a * b​

Вычисляет произведение чисел.

divide(a, b), оператор a / b​

Вычисляет частное чисел. Тип результата всегда является типом с плавающей запятой. То есть, деление не целочисленное. Для целочисленного деления, используйте функцию intDiv. При делении на ноль получится inf, -inf или nan.

intDiv(a, b)​

Вычисляет частное чисел. Деление целочисленное, с округлением вниз (по абсолютному значению). При делении на ноль или при делении минимального отрицательного числа на минус единицу, кидается исключение.

intDivOrZero(a, b)​

Отличается от intDiv тем, что при делении на ноль или при делении минимального отрицательного числа на минус единицу, возвращается ноль.

modulo(a, b), оператор a % b​

Вычисляет остаток от деления. Тип результата — целое число, если оба аргумента — целые числа. Если один из аргументов является числом с плавающей точкой, результатом будет число с плавающей точкой. Берётся остаток в том же смысле, как это делается в C++. По факту, для отрицательных чисел, используется truncated division. При делении на ноль или при делении минимального отрицательного числа на минус единицу, кидается исключение.

moduloOrZero(a, b)​

В отличие от modulo, возвращает ноль при делении на ноль.

negate(a), оператор -a​

Вычисляет число, обратное по знаку. Результат всегда имеет знаковый тип.

abs(a)​

gcd(a, b)​

Вычисляет наибольший общий делитель чисел. При делении на ноль или при делении минимального отрицательного числа на минус единицу, кидается исключение.

lcm(a, b)​

Вычисляет наименьшее общее кратное чисел. При делении на ноль или при делении минимального отрицательного числа на минус единицу, кидается исключение.

max2​

Сравнивает два числа и возвращает максимум. Возвращаемое значение приводится к типу Float64.

Синтаксис

max2(value1, value2) 

Аргументы

  • value1 — первое число. Int/UInt или Float.
  • value2 — второе число. Int/UInt или Float.

Возвращаемое значение

  • Максимальное значение среди двух чисел.

Пример

SELECT max2(-1, 2); 

Форум пользователей MySQL

Подскажите. Как выбрать количество строк в % от общего количества строк.

1) существует таблица table_name as t c полями: t.1, t.2, t.3

2) в запросе select * from table_name as t выводит 500 строк

3) необходимо вывести 30% строк от 500 и условие желательно указать не selecte a в where, поскольку процентную выборку строк намереваюсь через insert into вставить в другую таблицу (применяется в процедуре).

#2 16.09.2013 17:44:02

vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5818

Re: Выборка строк в процентах

Почему вы не хотите решить задачу в несколько запросов — посчитать кол-во строк в таблице count(*), округлить 30% до целого числа и выбрать по limit?
Можно попробовать решить задачу в один запрос, но это будет жуткое извращение.

#3 17.09.2013 09:28:26

ivan27 Участник Зарегистрирован: 16.09.2013 Сообщений: 6

Re: Выборка строк в процентах

Потому что есть такая штука как оптимизация запросов и чем решение проще тем оно быстрее и надежнее, и соответственно выполнение кода не будет насиловать сервер своими обращениями и манипуляциями в тот момент когда к базе обращено несколько сотен человек. По логике вещей в MySQL должна быть предусмотрена выборка на подобии Limit но в процентом соотношени. В Microsoft SQL Server такая выборка предусмотрена название не помню начинается с буквы Т. и пишется все в одну строку, но вот в MySQL к сожалеию не работает .

#4 17.09.2013 09:40:49

vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5818

Re: Выборка строк в процентах

ivan27 написал:

Потому что есть такая штука как оптимизация запросов и чем решение проще тем оно быстрее и надежнее, и соответственно выполнение кода не будет насиловать сервер своими обращениями и манипуляциями в тот момент когда к базе обращено несколько сотен человек.

Проще и одним запросом — разные понятия (в данном случае проще и быстрее будут несколько простых запросов).
Одним запросом лучше не делать (см до конца http://sqlinfo.ru/forum/viewtopic.php?id=1742 )

ivan27 написал:

По логике вещей в MySQL должна быть предусмотрена выборка на подобии Limit но в процентом соотношени. В Microsoft SQL Server такая выборка предусмотрена название не помню начинается с буквы Т. и пишется все в одну строку, но вот в MySQL к сожалеию не работает .

В MySQL такой штуки нет.

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

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