Как вычислить процент с помощью инструкции SQL
у меня есть таблица SQL Server, которая содержит пользователей и их оценки. Для простоты давайте просто скажем, что есть 2 столбца — name & grade . Таким образом, типичной строкой будет имя: «Джон Доу», класс:»а».
Я ищу один оператор SQL, который найдет проценты всех возможных ответов. (A, B, C и т. д. ) Кроме того, есть ли способ сделать это без определения всех возможных ответов (открытое текстовое поле — пользователи могут ввести «pass/fail», «none» и т. д. )
финал выход, который я ищу, — это A: 5%, B: 15%, C: 40% и т. д.
11 ответов
Я проверил следующее, И это работает. Ответ Гордия был близок, но имел умножение 100 в неправильном месте и имел некоторые отсутствующие скобки.
наиболее эффективный (использование over ()).
универсальный (любая версия SQL).
С CTE, наименее эффективным.
вместо использования отдельного CTE для получения общей суммы Вы можете использовать функцию окна без предложения «partition by».
Если вы используете:
чтобы получить счетчик для группы, вы можете использовать:
чтобы получить общее количество.
это, как правило, быстрее в моем опыте, но я думаю, что он может внутренне использовать временную таблицу в некоторых случаях (я видел «рабочий стол» при работе с » set statistics io on»).
EDIT: Я не уверен, что мой пример запроса-это то, что вы ищете, я просто иллюстрировал, как работают оконные функции.
вы должны рассчитать общее количество оценок Если это SQL 2005, вы можете использовать CTE
вам нужно сгруппироваться в поле оценка. Этот запрос должен дать вам то, что вы ищете в практически любой базе данных.
вы должны указать систему, которую вы используете.
Я просто использую это, когда мне нужно разработать процент..
обратите внимание, что 100.0 возвращает десятичные дроби, тогда как 100 самостоятельно округляет результат до ближайшего целого числа, даже с помощью функции ROUND ()!
это, я считаю, общее решение, хотя я тестировал его с помощью IBM Informix Dynamic Server 11.50.ГС3. Следующий запрос:
дает следующие выходные данные по тестовым данным, показанным ниже горизонтального правила. The ROUND функция может быть специфичной для СУБД, но остальные (возможно) нет. (Обратите внимание, что я изменил 100 на 100.0, чтобы гарантировать, что вычисление происходит с использованием нецелочисленного десятичного, числового арифметического; см. комментарии и спасибо Гром.)
должно работать следующее
EDIT: переместил * 100 добавил 1.0 чтобы убедиться, что он не выполняет целочисленное деление
в любой версии sql server вы можете использовать переменную для общего числа всех классов, как это:
вы можете использовать подзапроса выборки в запросе (хоть и не уверен, что быстрее):
вы также можете использовать хранимую процедуру (извинения за синтаксис Firebird):
Источник
Процент SQL от общего
Привет, как я могу получить процент от каждой записи по отношению к общему количеству? Давайте представим, что у меня есть одна таблица со следующей
Процент ID 1 равен 20% для 2 равно 30% и так одно как мне это получить?
3 ответа
попробуй вот так
Есть пара подходов для получения этого результата.
По сути, вам нужны «итоговые» баллы из всей таблицы (или любого другого подмножества), и вы должны повторять их в каждой строке. Получение процента является простым вопросом арифметики, выражение, которое вы используете для этого, зависит от типов данных и от того, как вы хотите, чтобы это форматировалось.
Вот один из способов (из нескольких возможных) получить указанный результат:
Запрос представления s выполняется первым, что дает одну строку. Операция объединения сопоставляет эту строку с каждой строкой из t . И это дает нам значения, которые мы должны рассчитать в процентах.
Другой способ получить этот результат без использования операции соединения — использовать подзапрос в списке SELECT для возврата итогов.
Обратите внимание, что подход объединения может быть расширен для получения процента для каждой «группы» записей.
Чтобы получить этот результат, мы можем использовать тот же запрос, но запрос на просмотр для s , который возвращает всего GROUP BY r.type , и тогда операция соединения — это не соединение CROSS, а совпадение по типу:
Чтобы сделать тот же результат с подзапросом, это будет коррелированный подзапрос, и этот подзапрос, вероятно, будет выполняться для каждой строки в t .
Вот почему для меня более естественно использовать операцию соединения, а не подзапрос в списке SELECT . даже когда подзапрос работает так же. (Шаблоны, которые мы используем для более сложных запросов, таких как присвоение псевдонимов таблицам, квалификация всех ссылок на столбцы и форматирование SQL . эти шаблоны просто возвращаются к простым запросам. Обоснование этих шаблонов в некотором смысле теряется в простых запросы.)
Чтобы добавить хороший список ответов, это должно быть быстрым с точки зрения производительности и довольно простым для понимания:
Просто замените переменную таблицы вашей фактической таблицей внутри CTE.
Источник
Вывести процентное соотношение sql
SELECT Color, COUNT(*), SUM(StandardCost), 0 AS Sort1
FROM Production.Product
WHERE Color = N’Silver’ OR Color = N’Black’
GROUP BY Color
UNION ALL
SELECT N’�����’, COUNT(*), SUM(StandardCost), 1 AS Sort1
FROM Production.Product
WHERE Color = N’Silver’ OR Color = N’Black’
UNION ALL
SELECT N’�����’, COUNT(*), SUM(StandardCost), 2 AS Sort1
FROM Production.Product
UNION ALL
SELECT N’������� ����� �� �����’, COUNT(*), SUM(StandardCost), 3 AS Sort1
FROM Production.Product
| |
KRS544 Member ������: | ��� ������� ��������� ������� «�����», ��������� � ����������, ����� ����������� � �������. |
7 ��� 16, 16:42����[19267954] �������� | ���������� �������� ���������� |
| |
alks Member ������: | KRS544, ������ ���������� �������� — � ������� |
7 ��� 16, 16:52����[19267995] �������� | ���������� �������� ���������� |
| |
KRS544 Member ������: | |
7 ��� 16, 17:10����[19268070] �������� | ���������� �������� ���������� |
| |
o-o Guest | |
7 ��� 16, 17:14����[19268085] �������� | ���������� �������� ���������� |
| |
alks Member ������: | KRS544, �������, ������ ���� ����������� � ����� ����� � ����������! |
7 ��� 16, 17:16����[19268092] �������� | ���������� �������� ���������� |
| |
alks Member � ���������� ������ ����� ���������� �������� ������? | |
7 ��� 16, 17:24����[19268127] �������� | ���������� �������� ���������� |
| |
o-o Guest | ���, ��������, ��� �� ��������� �� ������� ���� ����� 2 � 3. � �����-�� ��� �������? ������ ����� ����������� ������� ����� � ��������� ��� ��������� |
7 ��� 16, 17:28����[19268147] �������� | ���������� �������� ���������� |
| |
������ � — �� Guest | alks, ����� ������� �������? Case � ����������� ����������� (rollup, cube) �� ������? |
7 ��� 16, 17:29����[19268158] �������� | ���������� �������� ���������� |
| |
alks Member ������: | o-o, ����� � SSMS — ����� ����������� ������ �� ����� SQL (����������� ������ ���), ����� ������� �� SSAS |
7 ��� 16, 17:37����[19268197] �������� | ���������� �������� ���������� |
| |
Alexander Us Member ������: | alks, — �� ��������� �����. ��� ����� ������, � ������. |
7 ��� 16, 17:37����[19268199] �������� | ���������� �������� ���������� |
| |
alks Member ������: | Alexander Us, �������� �������! |
7 ��� 16, 17:42����[19268223] �������� | ���������� �������� ���������� |
| |
��������� ������� Member ������: | alks, ����� ��� ����� ��������� ����� ����������. ���� �� ��� ������� ������ � ���� �� ��, ��� � ���. |
7 ��� 16, 17:56����[19268271] �������� | ���������� �������� ���������� |
| |
invm Member ������: ������ | |
7 ��� 16, 18:07����[19268313] �������� | ���������� �������� ���������� |
| |
alks Member ������: | ��������� �������, � ������ ��� ������ sql, ����� ����� ����� ��������� ���, ��� ���� �������� � �������� ������ ������ (� ����. ���������) � 1� � ������� ���������� �������� � ���������� ����������� (�� ���� ���� ��������� ���� ������������ �����) — � ������ ��� �� sql ������� (� �������������� ��������� � ���� ������� ��� ��� � � vba � ������, � ��� ������ � ������� ������� ������ � ����������� ����������� — ����) ���� �������� �������� ����� sql ����� ������� �� olap ���� ����� ssas ����� �� ssrs |
7 ��� 16, 18:13����[19268330] �������� | ���������� �������� ���������� |
| |
west74 Member ������: ��������� | ����������� invm ����� ���������� declare @t table insert into @t(color,StandartCost) values select * from ( select from (select |
9 ��� 16, 15:17����[19276573] �������� | ���������� �������� ���������� |
| |||
o-o Guest |
� ���� ��� ����� �� ������� . SQL Server parse and compile time: SQL Server Execution Times: SQL Server Execution Times: (1 row(s) affected) SQL Server Execution Times: (1 row(s) affected) SQL Server Execution Times: (5 row(s) affected) (1 row(s) affected) SQL Server Execution Times: (5 row(s) affected) (1 row(s) affected) SQL Server Execution Times: Источник |