IF OBJECT_ID(N'datosPrueba') IS NOT NULL DROP TABLE datosPrueba SELECT BusinessEntityID,JobTitle,HireDate,VacationHours INTO datosPrueba FROM AdventureWorks2012.HumanResources.Employee SELECT * FROM datosPrueba
Son 290 filas, ahora aplicaremos el siguiente query:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn FROM datosPrueba WHERE VacationHours > 5 GROUP BY JobTitle, YEAR( HireDate ) HAVING COUNT( BusinessEntityID ) > 5 ORDER BY JobTitle
El orden de las fases es:
1.
FROM
2.
WHERE
3.
GROUP BY
4.
HAVING
5.
SELECT
6.
ORDER BY
1.- FROM
La tabla o tablas de donde necesitamos la información. Es
por ello que es la primera en ejecutarse.
2.- WHERE
Es aquí donde aplicamos los filtros necesarios, uno de los
errores es cuando intentamos utilizar una columna generada a partir de una
función o una operación:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn FROM datosPrueba WHERE cn > 5 GROUP BY JobTitle, YEAR( HireDate ) HAVING COUNT( BusinessEntityID ) > 5 ORDER BY JobTitle
Genera el error debido a que esa columna aún no es creada,
se genera en la fase del SELECT y este aún no se ejecuta.
En este paso, tampoco ha sido creado la columna yr por ello nos genera ese error,
debemos utilizar el nombre de la columna o en este caso YEAR( HireDate ).
3.- GROUP BY
Una vez filtradas las filas que necesitamos, podemos
utilizar la sentencia GROUP BY para agrupar resultados, recordemos que aquellas
columnas que no utilicen una sentencia de agregado como MAX, MIN, AVG, COUNT,
etc, deberán ser listadas en esta fase. De la misma forma que en la fase
anterior, solemos cometer un error común:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn FROM datosPrueba WHERE VacationHours > 5 GROUP BY JobTitle, yr HAVING COUNT( BusinessEntityID ) > 5 ORDER BY JobTitle
4.- HAVING
Es similar a la fase WHERE pero aquí se filtran los
resultados del GROUP BY, es por ello que se ejecuta después de esta última. Si
intentamos filtrar por el nombre de una columna que será creada en el SELECT,
este será el resultado.
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn FROM datosPrueba WHERE VacationHours > 5 GROUP BY JobTitle, YEAR( HireDate ) HAVING cn > 5 ORDER BY JobTitle
Entonces lo correcto es utilizar funciones de agregado:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn FROM datosPrueba WHERE VacationHours > 5 GROUP BY JobTitle, YEAR( HireDate ) HAVING COUNT( BusinessEntityID ) > 5 ORDER BY JobTitle
5.- SELECT
Es en esta fase es donde las columnas son creadas a partir de
las funciones que hemos indicado, por ejemplo YEAR, COUNT, AVG, etc. También podemos utilizar sentencias
como CASE WHEN, IIF.
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn, CASE WHEN YEAR( HireDate ) > 2004 THEN 'SI' ELSE 'NO' END AS otraColumna FROM datosPrueba WHERE VacationHours > 5 GROUP BY JobTitle, YEAR( HireDate ) HAVING COUNT( BusinessEntityID ) > 5 ORDER BY JobTitle
Lo que no podemos hacer es utilizar columnas que son creadas
en la misma fase, por ejemplo:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn, CASE WHEN yr > 2004 THEN 'SI' ELSE 'NO' END AS otraColumna FROM datosPrueba WHERE VacationHours > 5 GROUP BY JobTitle, YEAR( HireDate ) HAVING COUNT( BusinessEntityID ) > 5 ORDER BY JobTitle
6.- ORDER
BY
Es la última fase y es en la única en la que se permiten
utilizar los ALIAS que fueron declarados en la fase SELECT dado que esta última
se ejecuta previamente.
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn, CASE WHEN YEAR( HireDate ) > 2004 THEN 'SI' ELSE 'NO' END AS otraColumna FROM datosPrueba WHERE VacationHours > 5 GROUP BY JobTitle, YEAR( HireDate ) HAVING COUNT( BusinessEntityID ) > 5 ORDER BY yr,JobTitle
Espero que les sirva de ayuda.
SALUDOS
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE
0 comentarios:
Publicar un comentario