4. Lenguaje SQL 2017
4. Lenguaje SQL 2017
LENGUAJE SQL
Por supuesto, a partir del estándar cada gestor de bases de datos ha desarrollado su
propio SQL que puede variar de un gestor a otro, pero con cambios que no suponen
ninguna complicación para alguien que conozca un SQL concreto, o simplemente conozca
el ANSI SQL.
Como su nombre lo indica, el SQL nos permite realizar consultas a la base de datos. Pero
en realidad, permite realizar diversas tareas referidas a la definición, control y gestión de la
base de datos. Las sentencias SQL se clasifican, según su finalidad, en siete categorías
distintas, pero en el presente texto sólo nos concentraremos en dos categorías específicas:
Una sentencia SQL es similar a una frase (escrita en inglés) con la que decimos lo
que queremos obtener y de donde obtenerlo. Es decir, describe los resultados que se
quieren obtener, más que los procedimientos para llegar a ellos. Todas las sentencias
empiezan con un verbo (palabra reservada que indica la acción a realizar), seguido
de cláusulas, algunas obligatorias y otras opcionales, que completan la frase.
El presente texto es un resumen de las sentencias DDL y DML más importantes de SQL. En
la mayoría de ellas se ha reducido la sintaxis completa, ajustándolas sólo a lo que se
estudiará en el curso. En general, la sintaxis empleada será la correspondiente al ANSI
SQL, excepto en algunos casos particulares que se indican expresamente. Los ejemplos se
basan en el modelo de datos correspondiente a la práctica de SQL.
Página 1 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
La cláusula NOT NULL indica que el campo no podrá contener un valor nulo.
Una restricción a nivel de campo es una restricción que aparece dentro de la definición
del campo, después del tipo de dato y afecta a un campo (el que se está definiendo):
[CONSTRAINT NombreRestricción]
{PRIMARY KEY | UNIQUE | REFERENCES NombreTablaRef [(Expresión)]}
Una restricción a nivel de tabla es una restricción que se define después de definir todos
los campos de la tabla y afecta a un campo o a un conjunto de campos:
[CONSTRAINT NombreRestricción]
{ PRIMARY KEY Expresión |
UNIQUE Expresión |
FOREIGN KEY Expresión REFERENCES NombreTablaRef [(Expresión)]}
Como restricciones tenemos la de clave primaria (clave principal), la de índice único (clave
alternativa) y la de clave externa:
La cláusula PRIMARY KEY se utiliza para definir un campo o una combinación de campos
como clave primaria de la tabla. Esto supone que el campo no puede contener valores
nulos. En una tabla no puede haber varias claves primarias, por lo que no podemos incluir
la cláusula PRIMARY KEY más de una vez, en caso contrario la sentencia da un error. No
hay que confundir la definición de varias claves primarias con la definición de una clave
primaria compuesta por varios campos, esto último sí está permitido y se define con una
restricción a nivel de tabla.
La cláusula UNIQUE sirve para definir un índice único (clave alternativa) sobre un campo o
un conjunto de campos. Un índice único es un índice que no permite valores duplicados, es
decir que si un campo tiene definido una restricción de UNIQUE no podrá haber dos
registros con el mismo valor en ese campo.
Página 2 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Ejemplos:
Página 3 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
También nos permite crear nuevas restricciones o borrar algunas existentes. La sintaxis
puede parecer algo complicada pero sabiendo el significado de las palabras reservadas la
sentencia se aclara bastante; ADD (agrega), ALTER (modifica), DROP (elimina), COLUMN
(campo), CONSTRAINT (restricción).
Se pueden agregar campos con valores nulos a una tabla existente, sin alterar los datos
que ya contiene:
También podemos eliminar un campo, en este caso se pierden todos los datos
almacenados en él:
Página 4 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Para eliminar una restricción (previamente se le tiene que haber asignado un nombre en la
definición):
Ejemplos:
La sintaxis es la siguiente:
La sintaxis es la siguiente:
Después del nombre de cada campo podemos indicar cómo queremos que se ordenen los
registros según el índice mediante las cláusulas ASC/DESC, que indican si el índice es
ascendente o descendente. Se asume por defecto que el índice es ascendente.
Ejemplo:
La sintaxis es la siguiente:
Ejemplo:
Página 5 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
La sintaxis es la siguiente:
Cuando no se indica ninguna lista de campos después del nombre de la tabla, se asume por
defecto todos los campos de la tabla, en este caso, los valores se tienen que especificar en
el mismo orden físico en el que están establecidos los campos de la tabla, y se tiene que
utilizar el valor NULL para completar los campos de los cuales no tenemos valores.
Ejemplo:
INSERT INTO Clientes VALUES (6, 'JUAN', 'LOPEZ', 'PELLEGRINI 250', NULL, 2000)
Cuando indicamos los nombres de los campos, éstos no tienen por qué estar en
el orden físico en el que aparecen en la tabla, también se pueden omitir algunos campos, los
campos que no se nombran tendrán por defecto el valor NULL.
Observar que ahora hemos variado el orden de los valores y los nombres de campo no
siguen el mismo orden físico que tienen en la tabla, lo importante es poner los valores en el
mismo orden que los campos que enunciamos. Como no enunciamos el campo Telefono,
éste se completará con el valor nulo.
El hecho de colocar una lista de campos podría parecer peor ya que se tiene que escribir
más, pero realmente tiene ventajas sobre todo cuando la sentencia la vamos a almacenar y
reutilizar:
- La ventaja más importante es que se logra la independencia respecto del orden físico, es
decir, si se cambia el orden físico de los campos en la tabla, no habría inconvenientes,
mientras que de la otra forma intentaría asignar los valores a otro campo, esto produciría
errores de 'tipo no corresponde' y lo que es peor podría asignar valores erróneos sin que
nos demos cuenta.
- Además la sentencia queda más fácil de interpretar, ya que leyéndola vemos qué valor
asignamos a qué campo, y de paso nos aseguramos que el valor lo asignamos al campo
que queremos
- Otra ventaja es que si se añade un nuevo campo a la tabla, el primer ejemplo daría error
ya que el número de valores no correspondería con el número de campos de la tabla,
Página 6 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
mientras que el segundo ejemplo no daría error y en el nuevo campo se insertaría el valor
NULL.
2 . 2 – Sentencia DELETE
La sentencia DELETE elimina registros de una tabla.
La sintaxis es la siguiente:
La cláusula WHERE sirve para especificar qué registros queremos borrar. Se eliminarán de
la tabla únicamente los registros que cumplan la condición especificada. Si no se indica la
cláusula WHERE, se borran TODOS los registros de la tabla.
Si la tabla donde borramos está relacionada con otras tablas se podrán borrar o no los
registros siguiendo las reglas de integridad referencial.
2 . 3 – Sentencia UPDATE
La sentencia UPDATE modifica los valores de uno o más campos en los registros
seleccionados de una tabla.
La sintaxis es la siguiente:
La cláusula SET especifica qué campos van a modificarse y qué valores asignar a esos
campos.
La expresión en cada asignación debe generar un valor del tipo de dato adecuado para el
campo indicado. La expresión debe ser calculable a partir de los valores del registro que se
está actualizando.
La cláusula WHERE indica qué registros van a ser modificados. Si se omite la cláusula
WHERE se actualizan todos los registros.
Página 7 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Si actualizamos un campo definido como clave externa, este campo se podrá actualizar o no
siguiendo las reglas de integridad referencial. El valor que se le asigna debe existir en la
tabla de referencia.
Si actualizamos un campo definido como clave primaria, este campo se podrá actualizar o
no siguiendo las reglas de integridad referencial, integridad de entidades y clave.
2 . 4 – Sentencia SELECT
La sentencia SELECT permite recuperar datos de una o varias tablas. Es considerada la
más potente de las sentencias SQL, porque basándose en las operaciones del álgebra
relacional, se pueden resolver problemas bastante complejos.
SELECT [DISTINCT]
[NombreTabla. | Alias.] NombreCampo1 [AS Nombre_Columna1] | Función1
[, [NombreTabla. | Alias.] NombreCampo2 [AS Nombre_Columna2] | Función2 ...]
FROM NombreTabla1 [[AS] Alias1] [, NombreTabla2 [[AS] Alias2 ...]
[WHERE CondiciónReunión1 [AND CondiciónReunión2 ...]
[AND | OR CondiciónSelección1 [AND | OR CondiciónSelección2 ...] ] ]
[GROUP BY NombreCampo1 [,NombreCampo2 ...] ] [HAVING CondiciónSelección]
[ORDER BY NombreCampo1 [ASC | DESC] [,NombreCampo2 [ASC | DESC] ...] ]
[UNION ComandoSELECT]
Empezaremos por ver las consultas más simples, basadas en una sola tabla.
Utilizaremos la siguiente sintaxis simplificada para comenzar:
El Alias es como un segundo nombre que asignamos a la tabla, si en una consulta definimos
un alias para la tabla, ésta se deberá nombrar utilizando ese nombre y no su nombre real,
además ese nombre sólo es válido en la consulta donde se define. El alias se suele emplear
en consultas basadas en más de una tabla que veremos más adelante. La palabra AS que
se puede poner delante del nombre de alias es opcional.
Lista de campos
La lista de campos que queremos que aparezcan en el resultado se especifica delante de la
cláusula FROM.
Página 8 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Ejemplo:
Utilización del *: Se utiliza el asterisco (*) en la lista de campos para indicar 'todos los
campos de la tabla'.
Ejemplo:
Ejemplo:
Campos calculados: Además de los campos que provienen directamente de la tabla origen,
una consulta SQL puede incluir campos calculados cuyos valores se calculan a partir de los
valores de los datos almacenados. En este caso, se especifica en la lista de selección
una expresión en vez de un nombre de campo. La expresión puede contener sumas, restas,
multiplicaciones y divisiones, paréntesis y también funciones predefinidas.
La cláusula WHERE
La cláusula WHERE selecciona únicamente los registros que cumplan la condición de
selección especificada.
En la consulta sólo aparecerán los registros para los cuales la condición es verdadera
(TRUE). La condición de selección puede ser cualquier condición válida o combinación de
condiciones utilizando los operadores NOT (no) AND (y) y OR (ó).
Ejemplos:
SELECT NroEmple, NomEmple, ApeEmple FROM Empleados WHERE Salario > 2000
Página 9 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Operadores especiales
Pertenencia a conjunto (IN)
Examina si el valor de la expresión es uno de los valores incluidos en la lista de valores.
Ejemplo:
Rango (BETWEEN)
Examina si el valor de la expresión está comprendido entre dos valores definidos.
Ejemplo:
Ejemplos:
Cuando un campo que interviene en una condición de selección contiene el valor nulo,
el resultado de la condición no es verdadero ni falso, sino nulo. Por eso si queremos
seleccionar los registros que tienen valor en un determinado campo, no podemos comparar
con el valor null, es decir la condición ‘Telefono = null’ devuelve el valor nulo sea cual sea el
valor contenido en el campo Telefono. Si queremos preguntar si un campo contiene el valor
nulo debemos utilizar el operador de valor nulo.
Ejemplos:
Ejemplo:
Página 10 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Por defecto el orden será ascendente (ASC) (de menor a mayor). Si queremos podemos
alterar ese orden utilizando la cláusula DESC, en este caso el orden será el inverso al ASC.
Ejemplo:
SELECT * FROM Empleados WHERE Salario > 2000 ORDER BY Salario DESC
También podemos ordenar por varios campos, en este caso se indican los campos
separados por comas. Se ordenan los registros por el primer campo de ordenamiento, para
un mismo valor del primer campo, se ordenan por el segundo, y así sucesivamente. La
cláusula DESC o ASC se puede indicar para cada campo y así utilizar un ordenamiento
distinto para cada campo. Por ejemplo ascendente por el primer campo y dentro del primer
campo, descendente por el segundo campo.
Ejemplo:
La cláusula DISTINCT
Al incluir la cláusula DISTINCT en el SELECT, se eliminan del resultado los registros
repetidos. Si se omite esta cláusula se incluirán todos los registros incluidos los duplicados.
No es necesario colocar DISTINCT si dentro de los campos que se incluyen en el resultado
de la consulta aparece la clave primaria o alguna clave alternativa.
Ejemplo:
El número de registros que queremos obtener se puede expresar con un número entero o
como un porcentaje sobre el número total de registros que se obtendrían sin la cláusula
TOP. En este último caso utilizaremos la cláusula TOP n PERCENT.
Ejemplo:
Página 11 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Ejemplos en VFP: (se escribe INTO, el tipo de tabla y luego el nombre de la tabla)
Es importante observar que la nueva tabla no conserva las restricciones de las originales, y
en particular, no posee clave primaria ni claves externas. Si se las quiere definir, debe
hacerse con comandos ALTER TABLE.
Funciones de agregado
En la lista de campos de una consulta pueden aparecer funciones de columna también
denominadas funciones de agregado. Una función de agregado se aplica a un campo o a
una expresión y obtiene un valor que resume el contenido del campo o de la expresión.
Utilizaremos las siguientes funciones:
COUNT(Expresión)
SUM(Expresión)
AVG(Expresión)
MAX(Expresión)
MIN(Expresión)
El argumento de la función indica con qué valores se tiene que operar, por eso
Expresión suele ser un nombre de campo que contiene los valores a resumir, pero también
puede ser cualquier expresión válida que devuelva una lista de valores
Página 12 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Los valores del argumento pueden ser de tipo numérico, carácter o fecha. El resultado de la
función tendrá el mismo tipo de dato que el argumento.
Ejemplo: Obtener la fecha de ingreso del último empleado que ingresó a la empresa
COUNT(NombreCampo) cuenta el número de valores que hay en el campo, los valores del
campo pueden ser de cualquier tipo, y la función siempre devuelve un número entero. Si el
campo contiene valores nulos esos valores no se cuentan, si en el campo aparece un valor
repetido, lo cuenta varias veces
COUNT(*) permite contar registros en vez de valores. Si el campo no contiene ningún valor
nulo, COUNT(NombreCampo) y COUNT(*) devuelven el mismo resultado, mientras que si
hay valores nulos en el campo, COUNT(*) cuenta también esos valores mientras
que COUNT(NombreCampo) no los cuenta.
o bien
o bien
En este caso las tres consultas devuelven el mismo resultado ya que el campo NroEmple no
contiene valores nulos ni repetidos (es la clave primaria de la tabla Empleados).
Por el contrario, esta consulta nos devuelve el número de valores no nulos que se
encuentran en el campo CodDepto de la tabla Empleados, por lo tanto nos dice cuántos
empleados están asignados a un departamento.
Esta consulta nos devuelve el número de valores diferentes que se encuentran en el campo
CodDepto de la tabla Empleados.
Página 13 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Producto cartesiano
Aplicando el producto cartesiano a dos tablas se obtiene una tabla con los campos de
la primera tabla junto a los campos de la segunda tabla, y los registros de la tabla resultante
son todas las posibles combinaciones de registros de la primera tabla con registros de
la segunda tabla.
El producto cartesiano se indica colocando en la cláusula FROM las tablas que queremos
combinar separadas por comas, podemos obtener así el producto cartesiano de dos, tres, o
más tablas.
Ejemplo:
Reuniones
Generalmente cuando queremos obtener datos de dos o más tablas es para asociar a los
registros de una tabla, un registro de la otra tabla, por ejemplo añadir a los pedidos los datos
del cliente correspondiente, o los datos del empleado, esto equivale a un producto
cartesiano con una selección de registros, es decir que al producto cartesiano de dos o más
tablas le agregamos una o más condiciones de reunión
La condición puede ser una igualdad de campos, uno de cada tabla, y en ese caso se habla
de equirreunión. La reunión natural, o sea cuando se elimina uno de los campos superfluos,
no se ejecuta automáticamente y hay que detallar los campos como en una proyección.
Ejemplo:
Otra forma de expresar la consulta anterior es utilizando la cláusula INNER JOIN dentro de
la cláusula FROM:
Para realizar una reunión externa izquierda o derecha se utilizan las cláusulas LEFT JOIN o
RIGHT JOIN.
Ejemplos:
SELECT *
FROM Empleados E LEFT JOIN Departamentos D ON [Link] = [Link]
Página 14 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
SELECT *
FROM Empleados E RIGHT JOIN Departamentos D ON [Link] = [Link]
La cláusula GROUP BY
Hasta ahora las consultas con funciones de agregado que hemos visto producen un único
registro como resultado. Por ejemplo, si queremos obtener el total de sueldos a pagar por el
departamento 1:
Pero si quisiéramos hacerlo con todos los departamentos, deberíamos ejecutar una consulta
para cada uno. Para resolver este problema, podemos agrupar los registros en grupos en
los cuales uno o más campos toman el mismo valor. En el caso del ejemplo anterior, sumar
los valores del campo Salario para cada grupo de registros en los cuales el departamento es
el mismo.
De esta manera, se pueden obtener subtotales con la cláusula GROUP BY. Una consulta
con una cláusula GROUP BY se denomina consulta agrupada ya que agrupa los registros
de la tabla origen y produce un único registro resumen por cada grupo formado. Los campos
indicados en el GROUP BY se llaman campos de agrupación.
Juntamente con las funciones de agregado que se utilicen, es obligatorio colocar los campos
de agrupación en la lista de campos que aparecen como resultado de la consulta.
Todos los registros que tienen valor nulo en el campo de agrupación, pasan a formar un
único grupo. Es decir, se considera al valor nulo como un valor cualquiera a los efectos de la
agrupación.
La cláusula HAVING
La cláusula HAVING se utiliza únicamente cuando aparece la cláusula GROUP BY y nos
permite seleccionar registros de la tabla resultante de una consulta de agrupamiento.
Ejemplo: Obtener los departamentos y el total de sueldos a pagar por cada departamento,
pero solamente de aquellos departamentos con un total a pagar superior a 5000.
Para obtener lo que se pide hay que calcular la suma de sueldos de los empleados de cada
departamento, por lo que hay que utilizar la tabla Empleados. Tenemos que agrupar los
empleados por departamento y calcular la suma para cada departamento, por último nos
queda seleccionar del resultado los registros (departamentos) que tengan una suma
superior a 5000.
Página 15 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
Subconsultas
Una subconsulta es una sentencia SELECT que aparece dentro de otra
sentencia SELECT que llamaremos consulta principal.
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando
que aparece encerrada entre paréntesis y no puede contener la cláusula ORDER BY.
Ejemplo: Obtener el o los números, nombres y apellidos de los empleados que ganan el
sueldo más alto de la empresa
Ejemplo: ¿Cuáles son los números de pedido y las fechas de entrega de los pedidos en los
que se han solicitado más de 10 unidades del artículo 3070?
También en este caso, el tipo de datos del único campo de la subconsulta debe coincidir con
el tipo de datos del operando a la izquierda del operador IN.
Con este operador la subconsulta puede tener uno o varios campos, en realidad no importa
ya que el operador no se fija en los campos devueltos, sino en si hay o no hay registros en
la tabla resultado de la subconsulta.
En la mayoría de los casos en que se utiliza el operador EXISTS habrá que utilizar una
referencia externa. Si no se utiliza una referencia externa la subconsulta devuelta siempre
será la misma para todos los registros de la consulta principal y en este caso se seleccionan
Página 16 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
todos los registros de la consulta principal (si la subconsulta genera registros) o ninguno (si
la subconsulta no devuelve ningún registro).
Ejemplo: Obtener el número, nombre y apellido de los clientes que han efectuado al menos
un pedido
En caso de que se quiera obtener los clientes que no han efectuado pedidos, debemos
anteponer el operador NOT al operador EXISTS
Uniones
Esta operación se utiliza cuando tenemos dos tablas con los mismos campos y queremos
obtener una nueva tabla con los registros de la primera y los registros de la segunda. En
este caso la tabla resultante tiene los mismos campos que la primera tabla (que son los
mismos que los de la segunda tabla).
Para realizar esta operación utilizamos el operador UNION. Después de la primera consulta
viene la palabra UNION y a continuación la segunda consulta.
Ejemplo: Obtener el número, nombre, apellido y dirección de todos los empleados y clientes
que viven en la ciudad de Rosario
Las dos consultas deben tener el mismo número de campos pero los campos pueden
llamarse de diferente forma, pero ser del mismo tipo de dato.
Los campos del resultado se llaman como los campos de la primera consulta.
Página 17 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
La unión no incluye registros repetidos, si algún registro está en las dos tablas, sólo aparece
una vez en el resultado.
Se puede unir más de dos tablas, para ello después de la segunda consulta repetimos la
palabra UNION ... y así sucesivamente.
También podemos indicar que queremos el resultado ordenado por algún criterio, en este
caso se incluye la cláusula ORDER BY, que se escribe después de la última consulta, al
final de la sentencia. Para indicar los campos de ordenamiento debemos utilizar los nombres
de campo de la primera consulta ya que son los que se van a utilizar para nombrar los
campos del resultado.
Cuando queremos representar una consulta resumen con dos campos de agrupación, como
una tabla de doble entrada en la que cada una de los campos de agrupación es una entrada
de la tabla utilizaremos un tipo de consulta que se denomina consulta de tabla de
referencias cruzadas.
La consulta será:
La consulta quedaría mucho más clara, si presentamos los resultados en un formato más
compacto como el siguiente:
Cliente 1 2 3 6 7
1 2 1
2 1
3 1 2 1
4 1 2
5 1 1
Este último resultado se obtiene mediante una consulta de referencias cruzadas. Observar
que uno de los campos de agrupación (Cliente) sigue definiendo los registros que aparecen
(hay un registro por cada cliente), mientras que el otro campo de agrupación (Mes) ahora
sirve para definir los campos, cada valor de mes define un campo en el resultado, y la celda
en la intersección de un valor de Cliente y un valor de Mes contiene la cantidad de pedidos.
Página 18 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
La sintaxis es la siguiente:
TRANSFORM Resultado
SELECT CampoFijo1, CampoFijo2,… FROM NombreTabla
GROUP BY NombreCampo
PIVOT CampoDinámico [IN (Valores)]
SELECT puede contener una cláusula WHERE para seleccionar los registros que se utilizan
para calcular el resultado, por ejemplo para establecer los pedidos mensuales de un año
específico.
En la cláusula PIVOT indicamos el campo cuyos valores van a definir los campos dinámicos
en el resultado, a este campo lo llamaremos pivote.
La cláusula IN permite definir el conjunto de valores que queremos que aparezcan como
campos dinámicos.
Es conveniente que el campo pivote que sirve de encabezado de campo tenga un número
limitado de posibles valores para que no se generen demasiados campos.
En nuestro ejemplo, resultado sería COUNT(*), el campo fijo es NroCliente con un alias para
que salga la palabra Cliente en el encabezado, el origen de datos es la tabla Pedidos
(porque el resultado COUNT(*) se obtiene de Pedidos), el campo del GROUP BY es
NroCliente ya que queremos un registro por cada cliente, el campo dinámico que colocamos
en la cláusula PIVOT sería MONTH(FechaPed).
TRANSFORM COUNT(*)
SELECT NroCliente AS Cliente
FROM Pedidos
GROUP BY NroCliente
PIVOT MONTH(FechaPed)
Cuando los posibles valores que puede tomar el campo pivote son conocidos y queremos
definir cuales queremos que aparezcan, en este caso usaremos la cláusula IN, en ella se
ponen entre paréntesis todos los posibles valores, o por lo menos los que queremos que
aparezcan en el resultado. Por ejemplo sólo nos interesan los meses de febrero y junio:
Página 19 de 20
INFORMATICA APLICADA – INGENIERIA INDUSTRIAL – FCEIA UNR – LENGUAJE SQL
TRANSFORM COUNT(*)
SELECT NroCliente AS Cliente
FROM Pedidos
GROUP BY NroCliente
PIVOT MONTH(FechaPed) IN (2,6)
Si no utilizamos la cláusula IN, los meses de abril, mayo, agosto, septiembre, octubre,
noviembre y diciembre no aparecen ya que no hay pedidos realizados durante estos meses,
si utilizamos la cláusula IN y definimos los doces valores posibles, sí aparecen los campos
correspondientes a estos meses y podemos observar que ningún cliente tiene pedidos en
esos meses:
TRANSFORM COUNT(*)
SELECT NroCliente AS Cliente
FROM Pedidos
GROUP BY NroCliente
PIVOT MONTH(FechaPed) IN (1,2,3,4,5,6,7,8,9,10,11,12)
Los campos fijos son los que aparecen delante de los campos dinámicos y son fijos porque
se genera un solo campo en el resultado por cada campo que hayamos indicado en la lista
de campos fijos. Los campos fijos se indican en la lista de selección de la sentencia
SELECT, un campo fijo que siempre debemos incluir es el que sirve de encabezado de
registro para que podamos saber cada registro a qué valor de encabezado de registro
corresponde. Pero además podemos incluir otros campos por ejemplo campos de resumen
de cada registro, sin que se tenga en cuenta la agrupación por el campo pivote.
Por ejemplo queremos saber para cada cliente cuántos pedidos ha hecho en total:
TRANSFORM COUNT(*)
SELECT NroCliente AS Cliente, COUNT(*) as Total
FROM Pedidos
GROUP BY NroCliente
PIVOT MONTH(FechaPed)
Cliente Total 1 2 3 6 7
1 3 2 1
2 1 1
3 4 1 2 1
4 3 1 2
5 2 1 1
Página 20 de 20