Las funciones DAX SUM y SUMX calculan la suma de valores numéricos y cuando pensamos en crear una medida de este tipo pueden surgir dudas entre cuál de las dos utilizar. En esta entrada de blog las compararemos desde varios puntos de vista como la descripción, la sintaxis, la forma en que operan y los resultados que devuelven, además de mostrar algunos ejemplos de su uso. Esperamos que cuando tengas necesidad de realizar este cálculo te resulte más sencilla la elección.
Modelo de datos
Empezaremos por crear un proyecto en Power BI Desktop donde nos conectaremos a la base de datos AdventureWorks de Microsoft. Seleccionaremos las tablas DimProduct y FactResellerSales y crearemos un modelo de datos con ellas.
A la tabla DimProduct la llamaremos Product y seleccionaremos las columnas ProductKey, ProductAlternateKey, ProductSubcategoryKey, SpanishProductName, StandardCost, Color, ModelName y Status.

Imagen 1. Vista de la tabla Product
A la tabla FactResellerSales la nombraremos Sales y elegiremos las columnas ProductKey, SalesOrderNumber, SalesOrederLineNumber, OrderQuantity, UnitPrice, DiscountAmount, TaxtAmt, OrderDate, DueDate y ShipDate.

Imagen 2. Vista de la tabla Sales
Cargaremos las tablas en el modelo y las relacionaremos.

Imagen 3. Vista de relaciones
Finalmente usaremos las funciones SUM() y SUMX() para crear distintas medidas donde se calculen:
- La cantidad total de unidades vendidas
- El importe total de las ventas
- Cantidad de productos de color rojo vendidos
Antes de comenzar a crear las métricas veamos en detalle las dos funciones.
Funciones DAX SUM y SUMX
Comparación:
Descripción
SUM() | SUMX() |
---|---|
Agrega todos los números en una columna |
Devuelve la suma de una expresión evaluada por cada fila de una tabla |
Ambas funciones suman valores numéricos |
Sintaxis
SUM() | SUMX() |
---|---|
SUM(<columna>) El parámetro <columna> es la columna que contiene los números a sumar. La función acepta valores numéricos o de fecha y devuelve como resultado un valor decimal. Las filas pueden contener valores en blanco. Los valores de la columna no se pueden filtrar. |
SUMX(<tabla>, <expresión>) El parámetro <tabla> es la tabla que contiene los valores para los cuales se evaluará la expresión. Puede ser el nombre de una tabla o una expresión que devuelve una tabla. El parámetro < expresión > es una columna que contiene los números que desea sumar o una expresión que se evalúa como una columna. Solo se tienen en cuenta los números de la columna. Se omiten los espacios en blanco, los valores lógicos y el texto. |
Admite un solo parámetro que debe ser el nombre de una columna por lo que los valores no se pueden filtrar |
Admite dos parámetros y ambos pueden ser expresiones por tanto la tabla y los valores se pueden filtrar |
¿Cómo realiza el cálculo?
SUM() | SUMX() |
---|---|
Opera solamente sobre la columna que se le pasa como parámetro |
Opera sobre todas las columnas de la tabla que se le pasa como primer parámetro |
Sumará directamente los valores de la columna |
Recorrerá cada fila de la tabla evaluando una expresión y realizará la suma de los valores |
Resultado
SUM() | SUMX() |
---|---|
Ambas funciones devuelven el mismo resultado, un número decimal. |
Medidas
Veamos ahora como crear las medidas para realizar los cálculos indicados con las dos funciones.
Calcular la cantidad total de unidades vendidas
Como se puede apreciar en la imagen 2, la tabla Sales contiene la columna OrderQuantity que almacena el número de unidades vendidas de cada producto en cada orden.
Si queremos calcular el total de unidades vendidas, debemos sumar los valores de la columna OrderQuantity. En este caso la función SUM() sería la elegida sin pensarlo mucho pues es justo lo que hace la función SUM(). La fórmula se vería así:
Unidades vendidas = SUM(Sales[OrderQuantity])
Sin embargo podríamos utilizar la función SUMX() para realizar el cálculo y el resultado sería el mismo. Como segundo parámetro pasamos la columna en lugar de una expresión. La fórmula sería:
Unidades vendidas 2 = SUMX (Sales; Sales[OrderQuantity])
Por el contrario de lo que puedas pensar las dos funciones son idénticas en rendimiento y eficiencia. Podemos usar cualquiera de las dos.
Calcular el importe total de las ventas
Si revisas la lista de campos de la tabla Sales verás que no contiene una columna con el importe de cada línea. Este importe podemos calcularlo si multiplicamos los valores de las columnas OrderQuantity y UnitPrice fila a fila y sumamos los resultados.
Dos formas de realizar el mismo calculo serían:
- Crear una columna calculada que calcule el producto de las dos columnas fila a fila y luego crear una medida que sume de los valores de la columna calculada.
Fórmula de la columna calculada:
Ventas línea = Sales[OrderQuantity] * Sales[UnitPrice]
Fórmula de la medida:
Total Sales = SUM([Ventas línea])
- La segunda solución es usar la función SUMX para crear directamente la medida sin necesidad de crear una columna calculada primero. La fórmula sería:
Total Sales 1 = SUMX(Sales;Sales[OrderQuantity] * Sales[UnitPrice])
Las dos medidas devuelven el mismo resultado. Con la primera solución almacenaríamos en el modelo permanentemente los resultados de multiplicar ambas columnas fila por fila, mientras que en la segunda solución no. La segunda solución es la más eficiente, es decir, elegiremos SUMX().
Calcular la cantidad de productos de color rojo vendidos
Para realizar este cálculo debemos tener en cuenta que a la función SUM() no se le puede pasar una expresión como parámetro, solo admite nombres de columnas. Esto implica que no se pueden filtrar las filas de la tabla sobre la que queremos realizar el cálculo y para lograrlo necesitamos combinarla con la función CALCULATE(). La fórmula se vería:
Quantity_Red_Color = CALCULATE(SUM(Sales[OrderQuantity]), Product[Color] = "Red")
Si usamos la función SUMX() para realizar el cálculo tenemos varias variantes:
Primera variante: Combinando las funciones SUMX() y FILTER()
La función SUMX admite como primer parámetro una expresión que devuelva una tabla y la función Filter lo hace. Esto nos permite filtrar la tabla Sales de manera que solo devuelva las filas donde el color del producto es rojo y luego sumamos los valores de la columna OrderQuantity. La columna Color está en la tabla Product y por ello necesitamos usar la función RELATED() para conocer el color del producto relativo a cada fila. La fórmula resultante sería:
Quantity_Red_Color_1 = SUMX(FILTER(Sales, RELATED('Product'[Color]) = "Red"), Sales[OrderQuantity])
Segunda variante: Combinando las funciones SUMX() y función IF().
En este caso el primer parámetro será la tabla Sales, sin filtrar, y el segundo una expresión. Recorreremos cada fila de la tabla Sales y comprobamos el valor de la expresión. Si la expresión es verdadera sumaremos los valores de la columna OrderQuantity. La expresión a utilizar será “Si el color del producto relacionado es rojo la expresión es verdadera, en otro caso es falsa”. La fórmula quedará:
Quantity_Red_Color_2 = SUMX(Sales, IF(RELATED('Product'[Color]) = "Red", Sales[OrderQuantity]))
Tercera variante: Combinando la función SUMX y la función CALCULATE()
Esta sería muy similar a la primera variante solo que usando la función SUMX en lugar de SUM.
Quantity_Red_Color_3 = CALCULATE(SUMX(Sales, Sales[OrderQuantity]), 'Product'[Color] = "Red")
Para este cálculo las fórmulas más convenientes serían: Quantity_Red_Color, Quantity_Red_Color_1 y Quantity_Red_Color_3 porque primero se filtra la tabla Sales y luego se calcula la suma de los valores de la columna OrderQuantity. La más ineficiente es Quantity_Red_Color_2 porque la tabla Sales no se filtra y la expresión contiene una declaración de comparación compleja en su fórmula que ha de ejecutarse fila por fila y que puede hacer lento el rendimiento de la fórmula. Puede utilizarse cualquiera de las dos funciones
Conclusiones
La decisión de cuál de las dos funciones usar depende en algunos casos de sus preferencias personales, como en el cálculo de la cantidad total de unidades vendidas, y en otros de la estructura de sus datos como en el cálculo del importe total de las ventas. En el caso de SUMX tener en cuenta que mientras más simple la expresión mejor será el rendimiento de nuestro modelo.
28 comentarios
JavierNov 26, 2019 - 6:28 pm
Hola,
Creo que la base de datos de ejemplo que usáis para la entrada es AdventureWorksDW2016.
Gracias
Saludos, Javier
Diana Aguilera ReynaMay 28, 2021 - 9:43 am
Hola Javier,
Me has pillado!, es AdventureWorksDW2017.
Saludos.
LeonidasNov 5, 2020 - 5:54 am
Me pareció excelente la explicación del detalle del uso de las formulas. Gracias por el aporte.
Diana Aguilera ReynaNov 5, 2020 - 8:56 am
Muchas gracias Leonidas, me alegra que te haya gustado.
Saludos,
Diana
HugoNov 5, 2020 - 9:29 pm
Muy bien explicado, hace días venia con esta intriga.
Diana AguileraNov 5, 2020 - 9:46 pm
Muchas gracias Hugo,
Me alegra saber que te ha ayudado.
Saludos,
Diana.
RenatoNov 10, 2020 - 2:07 am
Muchas gracias por compartir
Diego ValenzuelaDic 23, 2020 - 4:22 pm
Excelente! muy buen post y muchas gracias
Diana Aguilera ReynaDic 23, 2020 - 5:04 pm
Hola Diego,
Muchas gracias por tu comentario. Espero haberte ayudado!
Saludos,
Diana.
Alejandro ÁlvarezFeb 21, 2021 - 8:58 pm
Excelente
Diana Aguilera ReynaMay 28, 2021 - 9:45 am
Gracias Alejandro!
Guido AlvarezAbr 4, 2021 - 2:20 am
Excelente explicación deja claro las capacidades de SUM y SUMX
Felicitaciones Diana
Diana Aguilera ReynaAbr 4, 2021 - 12:54 pm
Hola Guido,
Muchas gracias por tu comentario.
Saludos,
Diana
Daniel PirottiAbr 16, 2021 - 2:00 pm
Muy buena explicacion, me podrian ayudar , en un reporte en power bi , necesito sacar porcentajes , pero no del total general , sino por mas de un atributo, por ejemplo si tenemos las ventas por por pais y mes necesitaria porcentaje de ventas por cada pais/mes tomando como total las ventas de cada pais/mes.
Gracias
Diana Aguilera ReynaMay 28, 2021 - 9:45 am
Hola Daniel,
Muchas gracias por tus comentarios!
Saludos.
AlejandraMay 27, 2021 - 3:25 am
Muy bueno! Muchass gracias por tu explicaciòn. Muy clara.
Pregunta, por qué usaría sumx con calculate si lo puedo resolver con sum calculate?
Me marea
Diana Aguilera ReynaMay 28, 2021 - 9:41 am
Hola Alejandra,
Gracias por tus comentarios. La verdad es que quería mostrar que hay varias formas de realizar un mismo cálculo pero unas son más eficientes que otras. En el caso de CALCULATE() y SUMX() es equivalente a CALCULATE() y SUM(), y las dos son eficientes. A mi me gusta utilizar solo SUMX(). Entre esas tres es solo cuestión de gustos.
Saludos.
José PariMay 28, 2021 - 7:33 am
Excelente Díana.
Slds,
Diana Aguilera ReynaMay 28, 2021 - 9:42 am
Hola José,
Gracias por tus comentarios.
Saludos.
Javier A.Jul 2, 2021 - 2:05 am
Gracias por esta explicación tan completa. Excelente!
Diana Aguilera ReynaJul 2, 2021 - 8:34 am
Muchas gracias Javier!
Pablo QuirozAgo 3, 2021 - 1:38 pm
Gracias Diana, soy nuevo en esto y es lo que andaba buscando.
Diana Aguilera ReynaAgo 5, 2021 - 7:21 am
Hola Pablo,
Muchas gracias por tu comentario! Me alegra haberte ayudado.
Saludos.
JosepAgo 22, 2021 - 12:40 pm
Genial artículo Diana !
Gracias una vez más por tu conocimiento.
JBEne 20, 2022 - 2:49 pm
Gracias por el aporte Diana, muy bien explicado y estructurado
Diana Aguilera ReynaEne 20, 2022 - 6:49 pm
Muchas gracias José Enrique!
Saludos.
Christian RathFeb 22, 2022 - 1:59 pm
Diana, tu explicación y la presentación de variantes han sido de altísimo nivel. Muchas gracias por tan buen aporte.
Diana Aguilera ReynaFeb 22, 2022 - 7:40 pm
Hola Christian,
Muchas gracias por tus comentarios! Me alegra que te haya ayudado!
Saludos,
Diana