#sql #sql-server #excel #frequency
#sql #sql-сервер #excel #частота
Вопрос:
Привет, как вы, возможно, знаете, в Excel есть функция частоты, например:
=FREQUENCY(G3:G693,M683:M693)
Которая перегруппирует данные столбца в новую группу и подсчитает частоту.
Итак, как я могу сделать то же самое в SQL Server в хранимой процедуре???
Большое вам спасибо за ваш ответ…
Комментарии:
1. звучит как выберите field1, field2, count (*) записи группируются по field1, field2
Ответ №1:
Вы бы сделали это с помощью объединения и тщательной агрегации. Вызовите две таблицы Scores
и Bins
. Следующее является близким приближением:
select b.bin, count(s.score)
from Bins b left outer join
Scores s
on s.score <= b.bin
group by b.bin;
Единственное, чего у него нет, — это final bin для группы «больше, чем все остальное». Однако, если правильно выбрать ограничения для ячеек, это, вероятно, не понадобится. И, если вам нужна эта функциональность, замените left outer join
на a full outer join
.
Редактировать:
Приведенная выше совокупная частота. Упс. Вот правильный расчет частоты:
select b.bin, b.nextbin, count(s.score)
from (select b.*, (select min(b2.bin) from Bins b2 where b2.bin > b.bin) as nextbin
from Bins b
) b left outer join
Scores s
on s.score >= b.bin and (s.score < b.nextbin or b.nextbin is null)
group by b.bin, b.nextbin;
У этого есть аналогичная проблема с границами. Самый простой способ исправить это — правильно выбрать ячейки. (Вы можете исправить это в SQL, но это значительно усложняет запрос.)
Примечание в SQL Server 2012 вы можете заменить коррелированный подзапрос lead()
функцией.
Вот ссылка на frequency()
функцию, которая объяснит обозначение.
Комментарии:
1. Привет @Gordon Linoff Спасибо за ответ. Это работает идеально. Но мне также нужно добавить предложение «Where», тогда, когда столбец count равен 0, он не будет отображаться, так как я могу это исправить
2. @user3479682 . , , Я думаю, что это другой вопрос. Функция Excel, насколько я знаю, ничего не знает о
where
предложении.3. На самом деле я имею в виду в SQL Server с использованием хранимой процедуры. Потому что это динамический SQL с
where
предложением dynamic. Ваш приведенный выше код работает хорошо, пока я не введу Where `ID = ID’, затем, когда столбец count равен 0 (который я также хочу отобразить), но он просто не отображается