Вывести процентное соотношение sql

Как вычислить процент с помощью инструкции 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 7 ��� 16, 16:04����[19267777] �������� | ���������� �������� ����������

Re: ���������� �������� [new]
KRS544
Member

������:
���������: 497

��� ������� ��������� ������� «�����», ��������� � ����������, ����� ����������� � �������.
7 ��� 16, 16:42����[19267954] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
alks
Member

������:
���������: 12

KRS544, ������ ���������� �������� — � �������
7 ��� 16, 16:52����[19267995] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
KRS544
Member

������:
���������: 497

7 ��� 16, 17:10����[19268070] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
o-o
Guest
7 ��� 16, 17:14����[19268085] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
alks
Member

������:
���������: 12

KRS544, �������, ������ ���� ����������� � ����� ����� � ����������!
7 ��� 16, 17:16����[19268092] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
alks
Member

� ���������� ������ ����� ���������� �������� ������?

7 ��� 16, 17:24����[19268127] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
o-o
Guest
���, ��������, ��� �� ��������� �� ������� ���� ����� 2 � 3.
� �����-�� ��� �������?
������ ����� ����������� ������� ����� � ��������� ��� ���������
7 ��� 16, 17:28����[19268147] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
������ � — ��
Guest
alks,

����� ������� �������? Case � ����������� ����������� (rollup, cube) �� ������?
� ��� �������� ��������� ������ �� ������� — ������� �������

7 ��� 16, 17:29����[19268158] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
alks
Member

������:
���������: 12

o-o, ����� � SSMS — ����� ����������� ������ �� ����� SQL (����������� ������ ���), ����� ������� �� SSAS
7 ��� 16, 17:37����[19268197] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
Alexander Us
Member

������:
���������: 1180

alks,

— �� ��������� �����. ��� ����� ������, � ������.
��� � �������� � ������� ����� ���� �� 1000 ������.
�������� �����, ������ �� �� 3000 ������.
��� �� ��� ��� �������� � � ����.

7 ��� 16, 17:37����[19268199] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
alks
Member

������:
���������: 12

Alexander Us, �������� �������!
7 ��� 16, 17:42����[19268223] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
��������� �������
Member

������:
���������: 9076

alks,

����� ��� ����� ��������� ����� ����������. ���� �� ��� ������� ������ � ���� �� ��, ��� � ���.

7 ��� 16, 17:56����[19268271] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
invm
Member

������: ������
���������: 9901

7 ��� 16, 18:07����[19268313] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
alks
Member

������:
���������: 12

��������� �������, � ������ ��� ������ sql, ����� ����� ����� ��������� ���, ��� ���� �������� � �������� ������ ������ (� ����. ���������) � 1� � ������� ���������� �������� � ���������� ����������� (�� ���� ���� ��������� ���� ������������ �����) — � ������ ��� �� sql ������� (� �������������� ��������� � ���� ������� ��� ��� � � vba � ������, � ��� ������ � ������� ������� ������ � ����������� ����������� — ����)

���� �������� �������� ����� sql ����� ������� �� olap ���� ����� ssas ����� �� ssrs

7 ��� 16, 18:13����[19268330] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
west74
Member

������: ���������
���������: 76

�����������
invm ����� ����������

declare @t table
(
«color» varchar(20),
StandartCost numeric(12,2)
)

insert into @t(color,StandartCost) values
(‘Red’,1.1),(‘Red’,1.3),(‘Red’,1.5),(‘Red’,2.1),(‘Red’,0.9),
(‘Blue’,5.1),(‘Blue’,4.8),(‘Blue’,5.7),(‘Blue’,6.1),
(‘Black’,15.1),(‘Black’,14.8),(‘Black’,15.7),
(‘Silver’,7.1),(‘Silver’,6.8)

select * from (
select Color,
count_val,
cost_sum,
cast((1.0*count_val/SUM(count_val*case when [color] in (‘�����’,’�����’) then 0 else 1 end) over())*100 as int) ‘������� �����’,
cast((1.0*cost_sum/SUM(cost_sum*(case when [color] in (‘�����’,’�����’) then 0 else 1 end)) over())*100 as int) ‘������� ����’
from (

select
case
when color IS not null then color
when color IS null and aFlag=1 then ‘�����’
else ‘�����’
end as [Color],
count_val,
cost_sum,
aFlag
from (
select
color ,aFlag ,
sum(C_SB) count_val,
sum(S_SB) cost_sum

from (select
Color,aFlag,
COUNT(*) C_SB,
Sum(StandartCost) S_SB
from (
select
color,
case when color in (N’Silver’,N’Black’) then 1 else 0 end aFlag,
StandartCost
from (select case when color in (N’Silver’,N’Black’) then color else ‘offen’ end color,
standartCost from @t)D
) A
group by color,aFlag
) B
group by cube(color ,aFlag )
) C
where
(case
when color is not null and aFlag IS not null then 1
when color is null and aFlag Is null then 1
when color is null and aFlag=1 then 1
else 0 end
)=1
) Al
) A2 where isnull(color,»)<>‘offen’

9 ��� 16, 15:17����[19276573] �������� | ���������� �������� ����������
Re: ���������� �������� [new]
o-o
Guest
west74
invm ����� ����������

� ���� ��� ����� �� ������� .

SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 15 ms, elapsed time = 22 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table ‘Product’. Scan count 1, logical reads 15, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table ‘Product’. Scan count 1, logical reads 15, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 30 ms.

(5 row(s) affected)
Table ‘Product’. Scan count 1, logical reads 15, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 81 ms.
Warning: Null value is eliminated by an aggregate or other SET operation.

(5 row(s) affected)
Table ‘Worktable’. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘Product’. Scan count 1, logical reads 15, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 16 ms, elapsed time = 257 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

Источник

Читайте также:  Чем можно отмыть плитку от раствора
Оцените статью