Hola!

Hace un par de días el gran Nacho Cardenal nos lanzó el reto de resolver el algoritmo FizzBuzz (que no conocía) y que comentaba que había conocido a través de otro gran profesional llamado Brais Moure.

En fin, el «reto» consistía en a partir de una lista de valores (números del 1 al 100) se generara una lista donde, en el caso de que el valor fuera múltiplo de 3, apareciera Fizz, si el número era múltiplo de 5 aparezca Buzz, en caso de que el valor sea múltiplo de 3 y de 5 debe salir FizzBuzz y en el resto de casos, debería aparecer el valor original…

Y como mejor una imagen que 1000 palabras, aquí os muestro la «solución» a la que se desea llegar.

Bueno, pues yo pensé… ¿y por qué no lo planteamos también en una Query DAX? y aquí está mi propuesta, realizada sobre el editor de consultas DAX que tiene Power BI.

Comenzamos el la consulta con EVALUATE para indicar al editor DAX que comenzamos el código y seguidamente, definimos una variable vTabla con la función GENERATESERIES que creará una tabla con los valores de 1 a 100.

Seguidamente, crearemos una segunda variable llamada vResultado que utilizará la función ADDCOLUMNS. Esta función ADDCOLUMNS, recibe como primer argumento una tabla y retorna esta misma tabla iterando sobre ella y añadiendo nuevas columnas con las expresiones que indiquemos.

En nuestro caso, queremos que ADDCOLUMNS agregue a la tabla una nueva columna llamada «@FizzBuzz».

En esta nueva columna, aplicaremos la lógica necesaria para generar la expresión basada en el cálculo de 2 variables vM3 y vM5 que, gracias a la función MOD, retornarán el resto de la división de los elementos de cada fila con 3 y 5 respectivamente.

Tras este bloque interno de VARiables, utilizamos el palabra reservada RETURN para indicar que ahora queremos finalizar las variables y empezar con la ejecución de la expresión.

Lo que vamos a ejecutar en el bloque RETURN es la instrucción SWITCH para que en todas las filas sobre las que se itere (TRUE) evalúe las condiciones buscadas. Estas condiciones serán:

  • Si el resultado de _m3 y el resultado de _m5 son 0 (valor múltiplo de 3 y de 5) retorne «FizzBuzz»
  • Si el resultado de _m3 es 0, retorne «Fizz»
  • Si el resultado de _m5 es 0, retorne «Buzz»
  • En el resto de casos, retorne el valor de la columna original, identificada como [Value] por ADDCOLUMNS

Finalmente, ya solo nos queda cerrar el paréntesis de ADDCOLUMNS y volver a poner la palabra reservada RETURN para indicar que hemos acabado ya con el bloque primer bloque inicial de variables. Nuestra última línea de ejecución será el nombre de la VARiable vResultado.

Pulsaremos F5 para ejecutar el código completo y comprobar el resultado de la Query DAX

Categorías: Power Query

0 comentarios

Roberto Carrancio · 12 junio 2024 a las 9:25 am

Genial Toni, ya por aportar otra alternativa.
Si lo queremos hacer en SQL sería:

DROP TABLE IF EXISTS hashtag#FizzBuzz
create table hashtag#FizzBuzz (Numero int, Resultado varchar(8))
INSERT into hashtag#FizzBuzz (Numero) select * from GENERATE_SERIES(1, 100)
UPDATE hashtag#FizzBuzz set Resultado = CASE
WHEN (Numero % 3 = 0) AND (Numero % 5 = 0) THEN ‘FizzBuzz’
WHEN Numero % 3 = 0 THEN ‘Fizz’
WHEN Numero % 5 = 0 THEN ‘Buzz’
ELSE CONVERT(VARCHAR,Numero) END

SELECT * FROM hashtag#FizzBuzz

Donald Aguilar · 12 junio 2024 a las 11:39 am

Excelente Toni!

Fernando Lorenzo Izquierdo · 14 junio 2024 a las 5:21 pm

FissBuzz(número) función creada con LAMBDA, remitirte a mis últimas publicaciones en LinkedIn, donde utilizo función SI y los conectores lógicos junto a M.C.D.

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *