Я строю запрос с GROUP BY
предложением, которое нуждается в способности считать записи, основанные только на определенном условии (например, считать только записи, где определенное значение столбца равно 1).
SELECT UID,
COUNT(UID) AS TotalRecords,
SUM(ContractDollars) AS ContractDollars,
(COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1
FROM dbo.AD_CurrentView
GROUP BY UID
HAVING SUM(ContractDollars) >= 500000
COUNTIF()
Линия явно не удается , так как нет родной функции SQL называется COUNTIF
, но идея здесь , чтобы определить процент всех строк , которые имеют значение «1» для MyColumn.
Любые мысли о том, как правильно реализовать это в среде MS SQL 2005?
sql
sql-server-2005
senfo
источник
источник
ISNULL
, вместо этого вы можете сделатьCASE WHEN myColumn IS NULL
или использоватьifnull
( stackoverflow.com/a/799406/1861346 )Я обычно делаю то, что рекомендовал Джош, но мозговой штурм и тестирование слегка ненормальной альтернативы, которой я хотел поделиться.
Вы можете воспользоваться тем, что COUNT (ColumnName) не считает NULL, и использовать что-то вроде этого:
NULLIF - возвращает NULL, если два переданных значения совпадают.
Преимущество: выражает ваше намерение считать строки вместо записи SUM (). Недостаток: не так ясно, как это работает («магия», как правило, плохо).
источник
ISNULL
следующим образом :SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0)))
. Подождите, это выглядит просто уродливо ...Я бы использовал этот синтаксис. Он выполняет те же функции, что и предложения Джоша и Криса, но с преимуществом совместим с ANSI и не привязан к конкретному поставщику баз данных.
источник
NULLIF
включен стандарт SQL-92). Ответ Джоша может быть легко преобразован в стандартный SQL путем заменыisnull
наCOALESCE
.=
. Я использую его для «подсчета количества ответов> = 2».Добавляя к ответу Джоша,
Для меня это работало хорошо (в SQL Server 2012) без изменения «count» на «sum», и та же логика переносима на другие «условные агрегаты». Например, суммирование на основе условия:
источник
Как насчет
Короче
CASE
:)Работает, потому
COUNT()
что не считает нулевые значения, иIF
/CASE
возвращает ноль, если условие не выполнено и нетELSE
.Я думаю, что это лучше, чем использовать
SUM()
.источник
Не для конкретного продукта, но стандарт SQL обеспечивает
SELECT COUNT() FILTER WHERE <condition-1>, COUNT() FILTER WHERE <condition-2>, ... FROM ...
для этого. Или что-то, что очень похоже на это, я не знаю, с верху моей шляпы.
И, конечно, поставщики предпочтут придерживаться своих фирменных решений.
источник
FILTER
предложение, является PostgreSQL, но имитируетсяCASE
во всех них.Почему не так?
источник
Мне пришлось использовать COUNTIF () в моем случае как часть моих столбцов SELECT И чтобы имитировать% от числа раз, когда каждый элемент появлялся в моих результатах.
Так что я использовал это ...
Конечно, вам нужно будет отформатировать результат в соответствии с вашими требованиями к отображению.
источник
источник