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
SCRIPT
RESULTADO
Select Count(*) from Productlist
 
 
 
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.
SCRIPT
RESULTADO
Select Count(UnitPrice) from Productlist
 
 
 
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
 
SCRIPT
RESULTADO
Select Categoryname, Productname,
(CASE Unitprice
WHEN 0 THEN
NULL ELSE Unitprice END) as Precio
from Productlist
where Categoryname=‘Condiments’
 
 
 
 
Finalmente usamos, nuevamente la función COUNT, pero esta vez
encerrando la función CASE creada.
SCRIPT
RESULTADO
Select count(CASE Unitprice WHEN 0 THEN NULL ELSE Unitprice END) as Total
from Productlist
where Categoryname=‘Condiments’
 
 
 
Fuente de apoyo para la intruccion CASE
 
 

7 thoughts on “Conteo Condicional en SQL Server

  • 11 July, 2013 at 3:39 am
    Permalink

    Jorge Sarmiento :
    Maestro una consulta en caso de que quieramos contar por ejemplo solo los que son de estado contratados y no contratados en una determinada fecha por SQL server?

    Reply
    • 11 July, 2013 at 3:17 pm
      Permalink

      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′

      Reply
      • 12 July, 2013 at 1:02 am
        Permalink

        De antemano muchas gracias Doctor por su gran ayuda. Este problema mas bien esta duda no me dejo dormir tranquilo buen tiempo. Que seriamos sin los foros :3

        Reply
      • 12 July, 2013 at 2:33 am
        Permalink

        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.

        Reply
        • 12 July, 2013 at 3:17 pm
          Permalink

          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

          Reply
          • 13 July, 2013 at 2:13 am
            Permalink

            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.

          • 13 July, 2013 at 2:19 am
            Permalink

            Donde estan mis comentarios anteriores? ¿ Los borraron ?

Leave a Reply

Your email address will not be published. Required fields are marked *