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
 
 

9 comentarios en «Conteo Condicional en SQL Server»

  • el 2013-07-11 a las 03:39
    Enlace permanente

    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?

    Respuesta
    • el 2013-07-11 a las 15:17
      Enlace permanente

      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′

      Respuesta
        • el 2013-07-12 a las 15:17
          Enlace permanente

          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

          Respuesta
          • el 2013-07-13 a las 02:13
            Enlace permanente

            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.

          • el 2013-07-13 a las 02:19
            Enlace permanente

            Donde estan mis comentarios anteriores? ¿ Los borraron ?

          • el 2013-07-15 a las 17:03
            Enlace permanente

            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

  • el 2014-10-27 a las 15:41
    Enlace permanente

    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.

    Respuesta

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.