Conteo Condicional en SQL Server
Conteo Condicional en SQL Server
Recientemente he tenido la necesidad de hacer un conteo de datos condicional
en SQL Server, lo que en Excel es un CONTAR.SI, aprovechando la ocasión decidí documentar con ejemplo la tarea, para futuras oportunidades Suponiendo contamos con una tabla llamada ProductList, con los datos
que se muestran en la imagen de abajo y necesitamos contar los productos mayores a 0 de la categoría “Condiments”.Pues bien antes de realizar el conteo debemos tener en cuenta que la función COUNT() de SQL Server si la usamos como COUNT(*) contara todas las filas, por ejemplo
Y si lo que contamos es un campo de la tabla por ejemplo
COUNT(UNITPRICE), como en el ejemplo UNITPRICE tiene valores nulos en productos de la categoría “Seafood” estos no los contara.
Ahora como lo que necesitamos es contar los productos mayores que 0
de la categoría “Condiments”, si volviéramos Nulos los valores en 0 no los contaría, para esto usaremos la instrucción CASE
Finalmente usamos, nuevamente la función COUNT, pero esta vez
encerrando la función CASE creada.
Fuente de apoyo para la intruccion CASE
|
Suponiendo que tenemos una tabla empleados seria algo así como esto, vamos a crear con «Case» una columna que coloque 1 si esta contratado y nulo si no esta contratado:
Select NombreEmpleado, EstadoEmpleado, FechaIngreso
(CASE EstadoEmpleado
WHEN ‘Contratado’ THEN
1 ELSE Null END) as Estado
from Empleados
where Fecha Ingreso between ’01/01/2013′ and ’11/7/2013′
Ahora lo que asemos es que encerramos toda la instrucción CASE dentro de una Función COUNT para contar todos los Unos , teniendo en cuenta que la función «Count» no cuenta los nulos:
Select
COUNT((CASE EstadoEmpleado
WHEN ‘Contratado’ THEN
1 ELSE Null END)) as TotalContratados
from Empleados
where Fecha Ingreso between ’01/01/2013′ and ’11/7/2013′
Man todo bien y estupendo pero ahora el problema seria que se han creado dos nuevos campos como muestra la imagen y quiero restar esos dos campos pero que no pertenecen a ninguna tabla.
Te mando el link de la imagen :
https://www.dropbox.com/s/ae2rgbfkks0ugov/ConteoSql3.JPG
Muchas gracias por tu apoyo y por compartir tus conocimientos conmigo.
Lo único que tienes crear un campo calculado donde se reste estos campos de dejo el ejemplo:
Select DATENAME (month, (F_RecepBE)) as MEs, F_RecepBE as Fecha,
count (Idest) as ‘QPEdidos’,
count ((Case IdEst when’003′ Then 1 Else Null End)) as ‘Instalado’,
(count (Idest))-(count ((Case IdEst when ‘003’ Then 1 Else Null End))) as ‘Pendientes’
from Comercio
group by F_RecepBe, IdEst
Lo acabo de probar y funciono de maravillas, gracias mi estimado. Se agradede la colaboracion de todos. Apenas me llegue una informacion con gusto lo compartire con ustedes.
Donde estan mis comentarios anteriores? ¿ Los borraron ?
Buenos dias ..
Tengo un lio tengo este codigo
Select DATENAME(month,(F_RecepBE))as Mes ,F_RecepBE as Fecha,
COUNT(Idest) as ‘QPedidos’,
COUNT((CASE
WHEN IdEst=’003′ THEN
1 ELSE Null END )) as ‘Instalado’,
(count (Idest))-(count ((Case IdEst when ‘003’ Then 1 Else Null End))) as Pendientes,
Instalado / Qpedidos as ‘Eficiencia’
from Comercio
group by F_RecepBE
Pero me bota error :
Mens. 207, Nivel 16, Estado 1, Línea 10
El nombre de columna ‘Instalado’ no es válido.
Mens. 207, Nivel 16, Estado 1, Línea 10
El nombre de columna ‘Qpedidos’ no es válido.
y probe con este codigo y me bota esto :
SELECT
Mes,Fecha,QPedidos,Instalado,(QPedidos – Instalado) AS Pendientes,cast((Instalado/Qpedidos)*100 as varchar)+’ %’ as ‘Eficiencia’
FROM(
Select
DATENAME(month,(F_RecepBE))as Mes ,F_RecepBE as Fecha,
COUNT(Idest) as ‘QPedidos’,
COUNT((CASE WHEN IdEst =’003′ THEN 1 ELSE null END )) as ‘Instalado’
from Comercio
group by F_RecepBE
)T1
Me sale el campo pero no me calcula la eficiencia bien, Por favor si alguien me puede sacar de esta duda se lo agradecere mucho
Muy buena solucion el ultimo script, gracias viejo.
Con este mismo ejemplo, como le harías para pedirle cuantos diferentes Categorías (CategoryName) tienes, en este ejemplo tienes un resultado de: 8 diferentes categorías.