Estoy creando una consulta con una GROUP BY
cláusula que necesita la capacidad de contar registros basados solo en una determinada condición (por ejemplo, contar solo registros donde un determinado valor de columna es 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
La COUNTIF()
línea obviamente falla ya que no se llama a una función SQL nativa COUNTIF
, pero la idea aquí es determinar el porcentaje de todas las filas que tienen el valor '1' para MyColumn.
¿Alguna idea sobre cómo implementar esto correctamente en un entorno MS SQL 2005?
sql
sql-server-2005
senfo
fuente
fuente
ISNULL
, en cambio puede hacerCASE WHEN myColumn IS NULL
o usarifnull
( stackoverflow.com/a/799406/1861346 )Usualmente hago lo que Josh me recomendó, pero hice una lluvia de ideas y probé una alternativa un poco tonta que me apetecía compartir.
Puede aprovechar el hecho de que COUNT (ColumnName) no cuenta NULL y usar algo como esto:
NULLIF: devuelve NULL si los dos valores pasados son iguales.
Ventaja: expresa su intención de COUNT filas en lugar de tener la notación SUM (). Desventaja: no está tan claro cómo funciona ("magia" suele ser malo).
fuente
ISNULL
de la siguiente manera:SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0)))
. Espera, eso se ve feo ...Yo usaría esta sintaxis. Logra lo mismo que las sugerencias de Josh y Chris, pero con la ventaja de que cumple con ANSI y no está vinculado a un proveedor de base de datos en particular.
fuente
NULLIF
se incluye el estándar SQL-92). La respuesta de Josh se puede transformar fácilmente en SQL estándar reemplazándolaisnull
porCOALESCE
.=
. Lo estoy usando para "contar el número de respuestas> = 2".Agregando a la respuesta de Josh,
Me funcionó bien (en SQL Server 2012) sin cambiar el 'conteo' a una 'suma' y la misma lógica es portable a otros 'agregados condicionales'. Por ejemplo, suma basada en una condición:
fuente
Qué tal si
Más corto que
CASE
:)Funciona porque
COUNT()
no cuenta valores nulos yIF
/CASE
return null cuando no se cumple la condición y no hayELSE
.Creo que es mejor que usar
SUM()
.fuente
No es específico del producto, pero el estándar SQL proporciona
SELECT COUNT() FILTER WHERE <condition-1>, COUNT() FILTER WHERE <condition-2>, ... FROM ...
para este propósito. O algo que se parece mucho a eso, no lo sé.
Y, por supuesto, los proveedores preferirán seguir con sus soluciones patentadas.
fuente
FILTER
cláusula es PostgreSQL, pero está emuladoCASE
en todos ellos.¿Por qué no así?
fuente
Tuve que usar COUNTIF () en mi caso como parte de mis columnas SELECT Y para imitar un% del número de veces que cada elemento apareció en mis resultados.
Así que usé esto ...
Por supuesto, deberá formatear el resultado de acuerdo con sus requisitos de visualización.
fuente
fuente