El el foro de MSDN
un colega planteaba dudas acerca del uso de la clausula GROUP BY, entre ellas hacía
referencia a la restricción que existe en las columnas que pueden ser listadas
en el SELECT de la consulta, ya que solo es
posible que listemos columnas que estén incluidas en el GROUP BY o que
utilicemos funciones de agregación.
Es interesante
notar que existen muchas situaciones en las que requerimos listar columnas que
no sería lógico que se incluyeran en el GROUP BY, entonces ¿Cómo podemos
sobrellevar la restricción inherente esta clausula?, es en estos casos donde
nos podemos auxiliar de las tablas derivadas.
Tomemos como modelo
la Base de Datos Northwinds, tenemos un requerimiento en el que se nos solicita
una consulta que nos retorne la sumatoria de las ventas por producto, debiendo mostrar el código
del producto, el nombre del producto y las sumatoria de las ventas. Si nos basamos en la restricción de la
clausula GROUP BY tendríamos que incluir no solo el código del producto, sino también
el nombre, y esto no sería muy lógico, aquí vienen las tablas derivadas a
darnos elegancia y coherencia a nuestra consulta.
Tablas:
dbo.Products
dbo.Order Details
La consulta es
la siguiente:
SELECT P.ProductID,
P.ProductName ,O.QuantityTotal
FROM Products AS P
INNER JOIN (SELECT
ProductID, SUM(Quantity) AS QuantityTotal
FROM [Order Details]
GROUP BY ProductID) AS O
ON P.ProductID = O.ProductID
ORDER BY
P.ProductID
Podemos ver que
en este caso la implementación de una tabla derivada nos brinda la ventaja de “separar”
y categorizar las ordenes sumarizando las
ventas totales por producto, para luego simplemente utilizar el operador de
tabla (JOIN) ligándolo a la tabla Productos y permitiéndonos de forma natural
extraer el nombre o cualquier otra columna que nos interese, sin tener que
incluirla en el GROUP BY, permitiéndonos pasar por alto la restricción antes
mencionada.