Estou criando uma consulta com uma GROUP BY
cláusula que precisa da capacidade de contar registros com base apenas em uma determinada condição (por exemplo, contar apenas registros onde um determinado valor da coluna é igual a 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
A COUNTIF()
linha obviamente falhar uma vez que não há nenhuma função SQL nativa chamada COUNTIF
, mas a idéia aqui é determinar a porcentagem de todas as linhas que têm o valor '1' para MyColumn.
Alguma idéia de como implementar isso corretamente em um ambiente MS SQL 2005?
sql
sql-server-2005
senfo
fonte
fonte
ISNULL
, em vez disso, você pode fazerCASE WHEN myColumn IS NULL
ou usarifnull
( stackoverflow.com/a/799406/1861346 )Eu costumo fazer o que Josh recomendou, mas fiz um brainstorming e testei uma alternativa um pouco chata que eu queria compartilhar.
Você pode aproveitar o fato de que COUNT (ColumnName) não conta NULLs e usar algo como isto:
NULLIF - retorna NULL se os dois valores passados forem iguais.
Vantagem: expressa sua intenção de COUNT linhas em vez de ter a notação SUM (). Desvantagem: Não é tão claro como está funcionando ("mágica" geralmente é ruim).
fonte
ISNULL
o seguinte:SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0)))
. Espere, que só olha feio ...Eu usaria essa sintaxe. Ele obtém o mesmo que as sugestões de Josh e Chris, mas com a vantagem de ser compatível com ANSI e não vinculado a um fornecedor de banco de dados específico.
fonte
NULLIF
está incluído o padrão SQL-92). A resposta de Josh pode ser facilmente transformada no SQL padrão substituindoisnull
porCOALESCE
.=
. Estou usando para "contar o número de respostas> = 2".Adicionando a resposta de Josh,
Funcionou bem para mim (no SQL Server 2012) sem alterar a 'contagem' para uma 'soma' e a mesma lógica é portável para outros 'agregados condicionais'. Por exemplo, somando com base em uma condição:
fonte
E se
Menor que
CASE
:)Funciona porque
COUNT()
não conta valores nulos eIF
/CASE
retorna nulo quando a condição não é atendida e não existeELSE
.Eu acho que é melhor do que usar
SUM()
.fonte
Não é específico do produto, mas o padrão SQL fornece
SELECT COUNT() FILTER WHERE <condition-1>, COUNT() FILTER WHERE <condition-2>, ... FROM ...
para esse fim. Ou algo que se parece muito com isso, não sei de nada.
E, é claro, os fornecedores preferem manter suas soluções proprietárias.
fonte
FILTER
cláusula é o PostgreSQL, mas é emulado porCASE
todos eles.Por que não assim?
fonte
Eu tive que usar COUNTIF () no meu caso como parte das minhas colunas SELECT E para imitar uma% do número de vezes que cada item apareceu nos meus resultados.
Então eu usei isso ...
Obviamente, você precisará formatar o resultado de acordo com os requisitos de exibição.
fonte
fonte