La función SUMMARIZE muestra los distintos valores de una o varias columnas (denominadas columnas de agrupación) de una tabla, permitiendo además incluir expresiones que generen columnas calculadas, encargadas de devolver valores numéricos en base a las columnas de agrupación. Con ello logramos un comportamiento similar al obtenido mediante la cláusula GROUP BY de Transact-SQL.
Comenzaremos nuestro periplo acerca del uso de esta función con un ejemplo muy básico: mostrar los distintos valores de la columna RegionCountryName, perteneciente a la tabla DimGeography.
EVALUATE SUMMARIZE( 'DimGeography', 'DimGeography'[RegionCountryName] ) ORDER BY [RegionCountryName]
Como es lógico, podemos utilizar varias de las columnas correspondientes a la tabla pasada en el primer parámetro, también denominada tabla de entrada.
EVALUATE SUMMARIZE( 'DimGeography', 'DimGeography'[ContinentName], 'DimGeography'[RegionCountryName] ) ORDER BY [ContinentName],[RegionCountryName]
Para conseguir un resultado equivalente en SQL podemos emplear GROUP BY, tal y como hemos mencionado anteriormente, o también la cláusula DISTINCT, ya que hasta el momento no estamos usando una operación de agregado como COUNT, SUM, etc., sobre el conjunto de resultados.
SELECT ContinentName, RegionCountryName FROM DimGeography GROUP BY ContinentName, RegionCountryName ORDER BY ContinentName, RegionCountryName --////////////////////////////////////////////// SELECT DISTINCT ContinentName, RegionCountryName FROM DimGeography ORDER BY ContinentName, RegionCountryName
Supongamos ahora que de este resultado nos interesaría saber la cantidad de unidades vendidas para cada una de las combinaciones de continente y país. Para ello escribiremos una expresión que utilice la función SUM aplicada a la columna SalesQuantity de la tabla FactSales, y que añadiremos a SUMMARIZE como último parámetro.
EVALUATE SUMMARIZE( 'DimGeography', 'DimGeography'[ContinentName], 'DimGeography'[RegionCountryName], "Cantidades vendidas", SUM('FactSales'[SalesQuantity]) ) ORDER BY [ContinentName],[RegionCountryName]
En el caso de que necesitemos más columnas calculadas iremos añadiendo las expresiones correspondientes a las mismas como parámetros adicionales al final de la función, tal y como vemos a continuación, donde agregamos dos medidas para obtener el importe de venta y las ventas menos el descuento aplicado.
EVALUATE SUMMARIZE( 'DimGeography', 'DimGeography'[ContinentName], 'DimGeography'[RegionCountryName], "Cantidades vendidas", SUM('FactSales'[SalesQuantity]), "Importe ventas", SUM('FactSales'[SalesAmount]), "Venta con descuento", SUMX('FactSales', 'FactSales'[SalesAmount] - 'FactSales'[DiscountAmount]) ) ORDER BY [ContinentName],[RegionCountryName]
Al emplear una sentencia SQL para obtener un resultado equivalente ahora sí será necesario el uso de GROUP BY, dado que aplicamos diversas operaciones de agregado (suma) sobre varias columnas, así como la combinación de la tabla DimGeography con DimStore y FactSales, para que las columnas numéricas reflejen los valores correctos para cada continente y país.
SELECT ContinentName, RegionCountryName, SUM(SalesQuantity) AS [Cantidades vendidas], SUM(SalesAmount) AS [Importe ventas], (SUM(SalesAmount) - SUM(DiscountAmount)) AS [Venta con descuento] FROM DimGeography INNER JOIN DimStore ON DimGeography.GeographyKey = DimStore.GeographyKey INNER JOIN FactSales ON DimStore.StoreKey = FactSales.StoreKey GROUP BY ContinentName, RegionCountryName ORDER BY ContinentName, RegionCountryName
En la siguiente parte de esta serie abordaremos la forma de mostrar columnas de agrupación procedentes de múltiples tablas empleando SUMMARIZE.
Deja un comentario