martes, 2 de febrero de 2016

Group By, Having y su funcion agregada COUNT en SQL Server

Buenas tardes queridos lectores, en esta ocasión veremos la sentencia COUNT, que nos permite contar valores, bajo ciertos criterios que le indiquemos, pero como siempre, vamos a pasar a la práctica, ya que con ejemplos podremos comprenderlo mejor

COUNT

La función COUNT tiene por misión devolver el numero de elementos de un grupo. COUNT siempre devolverá un valor numérico.

Ejemplo 1:
Script que permita determinar el total de pasajeros registrados usando la función agregada COUNT

SELECT COUNT(*) AS [TOTAL DE PASAJEROS]
       FROM PASAJERO
GO

 En el script la función COUNT tiene como parámetro * que representa a cualquier columna de la tabla PASAJERO. El script también podría ser de la siguiente forma:

 SELECT COUNT(IDPASAJERO) AS [TOTAL DE PASAJEROS]
       FROM PASAJERO
GO

SELECT COUNT(NOMBRES) AS [TOTAL DE PASAJEROS]
       FROM PASAJERO
GO

En cualquiera de los casos, el resultado del script anterior seria:

Ejemplo 2:
Script que permita determinar el total de pasajeros registrados agrupados por su país, tenga en cuenta que las columnas a mostrar son: NOMBRE DEL PAIS, TOTAL DE PASAJEROS usando a función agregada COUNT así como las GROUP BY y JOIN



SELECT PAI.PAIS AS [PAIS], COUNT (PAS.IDPAIS) AS [TOTAL PASAJEROS]
       FROM PASAJERO PAS
       INNER JOIN PAIS PAI ON PAS.IDPAIS = PAI.IDPAIS
       GROUP BY PAI.PAIS
GO

En el script se define la primera columna con el nombre del país que se encuentra en la tabla PAIS, por tanto se tiene que añadir un INNER JOIN con la especificación de la tabla PAIS, el conteo se realiza al operador IDPAIS de la tabla PASAJERO en la clausa GROUP BY. En la imagen siguiente se muestra como sería el resultado de la consulta


Podríamos modificar el script anterior proponiendo que solo se muestren los países que superen en 1 la cantidad de pasajeros, para eso utilizaremos la clausula HAVING que nos permite especificar una condición a partir de un agrupamiento, quedaría así:

SELECT PAI.PAIS AS [PAIS], COUNT (PAS.IDPAIS) AS [TOTAL PASAJEROS]
       FROM PASAJERO PAS
       INNER JOIN PAIS PAI ON PAS.IDPAIS = PAI.IDPAIS
       GROUP BY PAI.PAIS
       HAVING COUNT(PAI.PAIS)>1
GO

El resultado se muestra a continuación:


Ejemplo 3:
Script que permita mostrar el total de países que aún no tienen un pasajero registrado utilizando LEFT JOIN, RIGHT JOIN y la función agregada COUNT



SELECT COUNT(*)  AS [TOTAL PAISES]
       FROM PASAJERO PAS
       RIGHT JOIN PAIS PAI ON PAS.IDPAIS = PAI.IDPAIS
       WHERE PAS.IDPASAJERO IS NULL
GO


En el script anterior se usa la clausula RIGHT JOIN para filtrar los países que aun no han sido asignados a ningún pasajero. En el siguiente script se muestra la misma implementación esta vez usando el LEFT JOIN

SELECT COUNT (*) AS [TOTAL DE PAISES]
       FROM PASAJERO PAS
       RIGHT JOIN PAIS PAI ON PAS.IDPAIS = PAI.IDPAIS
       WHERE PAS.IDPASAJERO IS NULL
GO

En ambos casos, el resultado es e 6 países que no tienen asignado pasajero.


Ejemplo 4:
Script que permita mostrar el total de pasajeros y el monto acumulado de pagos de un determinado país

SELECT PAI.PAIS AS [PAIS], COUNT (DISTINCT PAS.NOMBRES) AS [TOTAL PASAJEROS], SUM(MONTO) AS [MONTO ACUMULADO]
       FROM PASAJERO PAS
       INNER JOIN PAIS PAI ON PAS.IDPAIS=PAI.IDPAIS
       INNER JOIN PAGO PAG ON PAS.IDPASAJERO = PAG.IDPASAJERO
       GROUP BY PAI.PAIS
GO

La imagen siguiente muestra el resultado de la consulta:




En la caso de BRASIL se especifica que solo hay un pasajero registrado y el monto acumulado por él es de 3400. Si observa PERU notará que tiene un total de 3 pasajeros y que entre ellos acumulan un valor de 6200

Ejemplo 5:
Script que permita mostrar la cantidad de pasajeros asignado por cada país y aquellos países que aún no registran pasajero alguno asignar el valor 0

SELECT PAI.PAIS, COUNT(*) AS [TOTAL PASAJEROS]
       FROM PASAJERO PAS
       RIGHT JOIN PAIS PAI ON PAS.IDPAIS = PAI.IDPAIS
       WHERE PAS.IDPASAJERO IS NOT NULL
       GROUP BY PAI.PAIS
UNION
SELECT PAI.PAIS, 0 AS [TOTAL PASAJEROS]
       FROM PASAJERO PAS
       RIGHT JOIN PAIS PAI ON PAS.IDPAIS = PAI.IDPAIS
       WHERE PAS.IDPASAJERO IS NULL
       GROUP BY PAI.PAIS
GO

En el script hacemos uso del operador UNION que permitirá unir dos conjuntos de registros con la misma cantidad de columnas. Para asignar con cero a la columna Total de Pasajeros de aquellos países que no registran un pasajero es directamente sobre la consulta SELECT PAI.PAIS, 0 as  [TOTAL PASAJEROS] solo si el IDPASAJERO de la tabla PASAJERO es nulo

La ejecución del script da como resultado lo que se muestra en la siguiente imagen:


Hasta aquí el post queridos lectores, espero les haya sido de utilidad, espero comenten, compartan, den +1 o por lo menos le den clic a algún anuncio que les sea de interés. Que tengan buena tarde

¡Saludos!

Banderas de Visitantes

Flag Counter