Как найти проценты значений в SQL?
Я использую следующий запрос, чтобы узнать процент выигрыша героя в играх:
Но это дает мне процент для ВСЕХ игр. И я хочу знать
percentage(for Hero)=(Won games by this player)/(Played games by this hero)
процент (для Героя) = (Выиграли игры этим игроком)/(Все игры)
Благодарю.
3 ответа
Используйте count(HERO) вместо count(*) поскольку я думаю, что он не может выполнить группу должным образом.
EDIT: Я считаю, вы хотели, чтобы sum of PointsEarned делилась на счет. В этом случае запрос немного изменится, как показано ниже:
Как рассчитать процент с помощью оператора SQL
У меня есть таблица SQL Server, которая содержит пользователей и их оценки. Для простоты скажем, что есть 2 столбца — name & grade . Таким образом, типичной строкой будет имя: «Джон Доу», оценка: «А».
Я ищу один оператор SQL, который найдет процентное соотношение всех возможных ответов. (A, B, C и т. Д.) Кроме того, есть ли способ сделать это без определения всех возможных ответов (открытое текстовое поле — пользователи могут ввести «прошел / не прошел», «нет» и т. Д.)
Окончательный результат, который я ищу: A: 5%, B: 15%, C: 40% и т. Д.
13 ответы
Я протестировал следующее, и это действительно работает. Ответ gordyii был близок, но в нем было умножение 100 не в том месте и отсутствовали некоторые скобки.
ответ дан 01 дек ’09, 17:12
это дает результат в виде целых чисел. сумма результатов не равна 100. — гром
Не самый эффективный, так как таблица будет сканироваться дважды. Кроме того, запрос не будет выглядеть так просто, если имеется более одной ссылки на таблицу. — Алекс Аза
@Thunder вы можете изменить 100 на 100.0 для десятичных значений. — Джозеф
Может ли кто-нибудь объяснить, почему математический синтаксис SQL-запроса — это не то, что вы ожидаете от обычного? Например нормально я бы разделил на общее количество раз на 100? Искренне любопытно на этот счет с логической точки зрения. — Digitalsa1nt
@ Digitalsa1nt (100 * 2) / 4 = 50, (2/4) * 100 = 50, пока перечислитель является умножаемой частью. Из-за приоритета операторов SQL он будет таким же. однако из-за типов данных при использовании 100 вы все равно можете получить результат, округленный до 0 десятичных знаков, который вы хотите для%, где, как если бы вы поместили его после операции деления, вам нужно будет убедиться, что вы приводите к типу данных, который может обрабатывать десятичные разряды, иначе вы получите 100 или 0, а не фактический процент — Мэтт
4 Ways to Convert a Number to a Percentage in SQL Server (T-SQL)
Here are 4 ways to convert a number to a percentage value in SQL Server.
Strictly speaking, we’re not actually “converting” it to a percentage. We’re formatting the number as a percentage. But in order to do that, we need to convert the number from a numeric data type to a string.
Here are 4 ways to do that.
Example 1 – The FORMAT() Function
The most obvious choice to use is the FORMAT() function. This allows you to display numbers and dates in a specific format.
Here’s an example of using this function to display a number as a percentage:
Notice that four zeros were added to our value (two before the decimal point, and two after).
The following would be required to make this 55 percent:
If the number is the actual percentage value that you want, you can do this:
You can also remove the fractional part by adding a zero to the format specifier:
If required, you can also add more decimal places:
Example 2 – The CONVERT() Function
You can alternatively use the CONVERT() function to convert the number to a string, then add a percentage sign to the end.
This might seem a bit unnecessary given how easy the previous example made it, however, the FORMAT() function was only introduced in SQL Server 2012. Therefore, this is how you will need to do it if you use an earlier version of SQL Server.
Of course, if your number is something like .55 and you need that to display as 55.00 %, then you can always multiply it by 100:
In this case I also increased the size of the varchar data type to cater for the extra characters.
Also, you can remove the fractional part by using the LEFT() function:
Although you’d need to be careful when doing this, as the actual value could vary to be more or less than 2. In which case, you could use the TRIM() function to trim leading zeros and/or trailing dots:
However, this is not perfect, and the FORMAT() function obviously provides a lot more flexibility with a minimum of code.
Example 3 – The CAST() Function
We can alternatively use the CAST() function to do the same thing as the previous example:
Note that CAST() and CONVERT() use slightly different syntaxes. In the case of CAST() the value to be cast comes first, whereas it’s the other way around with CONVERT() .
Example 4 – The CONCAT() Function
You can also use the CONCAT() function to concatenate a number with the percentage sign:
This function implicitly converts all arguments to string types before concatenation.
Как составить MySQL запрос для начисления процента?
Помогите, пожалуйста, правильно составить такой запрос: Вывести всех продавцов, у которых есть 5 пар клиентов и посчитать 10% от суммы покупок этих клиентов (для теста можно кол-во пар сократить). Вот какой код сейчас есть:
Но он выводит что-то неадекватное.
Таблицы и код можно посмотреть по ссылке: ссылка.
Помогите, пожалуйста, составить этот запрос.
UPD1:
Как я вижу решение:
Взять af_id из таблицы arur
Вычислить все r_w_uid относящиеся к этому af_id из таблицы arur
Подсчитать их количество.
Как только общее количество r_w_uid достигнет, например, 6, то суммировать значения amount_value из таблицы orders относящиеся к uid из таблицы orders при условии status = Completed.
Но я могу с лёгкостью ошибаться.
Умножить полученное в предыдущем пункте значение на 0.1 и вывести значение.
UPD2:
Связи таблиц:
orders.uid = u_af.uid
u_af.id = arur.af_id
UPD3:
Описания таблиц:
1)
orders — таблица с информацией о платежах.
orders.uid — столбец с внутренним id пользователя.
orders.amount_value — столбец с суммой платежа.
orders.status — столбец со статусом платежа.
2)
u_af — таблица нужна для связи таблицы orders с таблицей arur.
3)
arur — таблица отношений между продавцами и клиентами.
arur.af_id — столбец с id продавца.
arur.r_w_uid — столбец с id клиента.
Пары формируются следующим образом:
Если посмотреть в таблицу arur, то можно увидеть что для, например, af_id = 52 есть несколько записей в столбце r_w_uid. Если взять все записи r_w_uid относящиеся af_id = 52 и поделить их на 2, то получим количество пар. Остаток не включается в пары.
- Вопрос задан более трёх лет назад
- 361 просмотр
- Вконтакте
Вы уж извините, но то что Вы написали в запросе . это даже приблизительно не то что Вы хотели получить на словах.
Да и на словах как то все поплыло «Вывести всех клиентов, у которых есть 5 пар клиентов» — кто на ком стоял?
Если в 2 словах по запросу, у Вас 2 LEFT JOIN, оба не нужны.
У Вас нет вообще связки между двумя экземплярами orders, да и не надо там 2 раза.
Ну в целом . работает долго и непонятно, будет данных больше, будет работать днями .
P.S. после долгих уточнений подходящий ответ такой, для MySQL 8+
Для более младших версий
- Вконтакте
select
arur.af_id,
sum(o.amount_value) * 0.1 sum_
from arur, u_af left join orders o on (o.uid = u_af.uid and o.status = ‘Completed’)
where u_af.id = arur.af_id
group by arur.af_id
having count(arur.r_w_uid) > 5
Я не очень понял по поводу status = Completed, просто вписал что считать только их
Вы, уважаемый, странные вещи говорите. т.к. Вы ищете кол-во эфимерных пар (вам просто надо делить на 2, нет зависимости в данных отвечающих за парность) то не морочте голову ни себе ни людям. Умножте на 2 вашу константу с которой сверяете (5 пар = 10 значений) и опишите это условие в having указав «>» или «>=» вашего сокрального значения «то получим количество пар. Остаток не включается в пары.»
select
arur.af_id,
sum(o.amount_value) * 0.1 sum_10p
from arur, u_af left join orders o on (o.uid = u_af.uid and o.status = ‘Completed’)
where u_af.id = arur.af_id
group by arur.af_id
having count(arur.r_w_uid) > 5*2
- Вконтакте
как Вы сами написали o.uid = 60, а это 9*1 000 000 = 9 000 000
Разберитесь со связями в таблицах, я первые селекты писал не загружая данные.
Т.к. Вам надо работать с парами, и в этом коментарии стало понятна связь, я напишу селект ниже, но он все еще на старых условиях. Как только подгоните условия, все должно посчитаться быстро.
так, я немного запутался с парами, я написал вверху парные операции, а Вам нужны парные клиенты .
Напишите селект который выводит пары для af_id = 52 и условие сортировки (кто неудачник, станет 9-м)
И напишите связку клиентов с orders, а то я не понимаю откуда 1 550 000 для af_id = 52
Максим, Запрос на получение отношений продавцов и клиентов.
Неудачником станет тот у которого больший arur.r_w_uid. В данном запросе arur.r_w_uid = 91
Т.к. появились нормальные связи, я накидал селект
Пока оставил но совсем непонятно зачем нам таблица u_af .
оставил left join . т.е. если у продавца есть 5 пар и больше клиентов но нет операций, строка будет выведена, насколько это нужно — не знаю