Usando tablas derivadas con agrupaciones

 

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.