У меня есть таблица SQL Server, которая содержит пользователей и их оценки. Для простоты, давайте просто скажем, что есть 2 столбца - name
& grade
. Таким образом, типичный ряд будет Имя: «Джон Доу», класс: «А».
Я ищу один оператор SQL, который найдет проценты всех возможных ответов. (A, B, C и т. Д.) Кроме того, есть ли способ сделать это без определения всех возможных ответов (открытое текстовое поле - пользователи могут ввести «пройти / не пройти», «нет» и т. Д.)
Конечный результат, который я ищу, - A: 5%, B: 15%, C: 40% и т. Д.
sql
sql-server
tsql
Alex
источник
источник
Наиболее эффективный (используя over ()).
Универсальный (любая версия SQL).
С CTE наименее эффективный.
источник
cast((count(*) / (sum(count(*)) over() / 100)) AS DECIMAL(18, 2)) as Percentage
over()
прекрасно работает на Postgresql 10Вместо того, чтобы использовать отдельный CTE для получения суммы, вы можете использовать оконную функцию без предложения "partition by".
Если вы используете:
чтобы получить счет для группы, вы можете использовать:
чтобы получить общее количество.
Например:
В моем случае это происходит быстрее, но я думаю, что в некоторых случаях он может использовать временную таблицу (я видел «Рабочий стол» при работе с «Установить статистику io вкл.»).
РЕДАКТИРОВАТЬ: я не уверен, что мой пример запроса, что вы ищете, я просто иллюстрировал, как работают функции окон.
источник
tempdb
которой находится рабочий стол. Логические чтения кажутся выше, но они учитываются не так, как обычноCOUNT(*) OVER ()
в вашем запросе будет возвращена совершенно не связанная цифра (в частности, количество строк в сгруппированном результирующем наборе). Вы должны использоватьSUM(COUNT(*)) OVER ()
вместо этого.Вы должны рассчитать общее количество оценок. Если это SQL 2005, вы можете использовать CTE.
источник
Вам нужно сгруппировать по полю оценки. Этот запрос должен дать вам то, что вы ищете практически в любой базе данных.
Вы должны указать систему, которую вы используете.
источник
Я просто использую это, когда мне нужно отработать процент.
Обратите внимание, что 100.0 возвращает десятичные дроби, а само по себе 100 округляет результат до ближайшего целого числа, даже с функцией ROUND ()!
источник
Следующее должно работать
РЕДАКТИРОВАТЬ: переместил
* 100
и добавил,1.0
чтобы убедиться, что он не делает целочисленное делениеисточник
Я считаю, что это общее решение, хотя я тестировал его с использованием IBM Informix Dynamic Server 11.50.FC3. Следующий запрос:
дает следующий вывод на тестовые данные, показанные ниже горизонтального правила.
ROUND
Функция может быть СУБД конкретного, но остальное (возможно) не является. (Обратите внимание, что я изменил 100 на 100,0, чтобы гарантировать, что вычисление происходит с использованием нецелого числа - DECIMAL, NUMERIC - арифметика; см. Комментарии и спасибо Thunder.)источник
источник
В любой версии сервера SQL вы можете использовать переменную для общего количества всех оценок, как это:
источник
Вы можете использовать вложенный выбор в вашем запросе from (не проверен и не уверен, что быстрее):
Или
Или
Вы также можете использовать хранимую процедуру (извинения за синтаксис Firebird):
источник
У меня была похожая проблема с этим. Вы должны иметь возможность получить правильный результат умножением на 1,0 вместо 100. См. пример Изображение прикреплено
Выберите оценку (Количество (класс) * 1,0 / (Выберите количество (*) из MyTable)) в качестве показателя из группы MyTable по классу
источник
Этот хорошо работает в MS SQL. Он преобразует varchar в результат числа с плавающей запятой, ограниченного двумя десятичными знаками.
источник