FizzBuzz (T-SQL Reto). Típico en entrevistas de trabajo

El reto FizzBuzz es un desafío típico en entrevistas de trabajo para programación. Hoy vamos a ver como resolverlo de manera simple en T-SQL.

Hoy me he encontrado en LinkedIn con una cosa que me ha llamado la atención, Antonio Jurado había publicado un post en el blog mundo-datos respondiendo a un video de Nacho Cardenal. Este último habría publicado hace unos días la resolución al reto de FizzBuzz en Excel. En los comentarios de su publicación original en LinkedIn, Juan José Luna proponía la solución al reto en Access. A esto se sumó Toni (en la publicación que yo vi) resolviendo el reto en DAX. Así que, no vamos a ser nosotros menos y vamos a resolverlo en SQL, ¿no?

El reto FizzBuzz

El reto FizzBuzz es un sencillo desafío de programación que se emplea en las entrevistas de trabajo técnicas para que el evaluador vea la capacidad de escribir código del candidato. 

Como digo, el reto es sencillo, debes codificar un algoritmo que, con los números del 1 al 100 devuelva la cadena “Fizz” si el número es múltiplo de 3, “Buzz” si es múltiplo de 5 o “FizzBuzz” si es múltiplo de 3 y de 5. 

Esto es lo que buscamos:

FizzBuzz-Resultado

FizzBuzz con T-SQL

Esto es sencillo, tenemos que crear una tabla con los números del 1 al 100 y una columna resultado que será FizzBuzz, Fizz, Buzz o el propio número. Vamos a ello.

Paso 1: Crear la tabla FizzBuzz

El primer paso es crear la tabla FizzBuzz, para ello vamos a comprobar primero si existe y en ese caso la borramos y creamos una nueva. Necesitamos un campo numérico que admita los valores del 1 al 100, con un tinyint nos vale, no vamos a usar más de lo necesario. Para el resultado tendremos que almacenar cadenas de texto pero, no siempre van a tener la misma longitud, podrán ser de 1 a 8 caracteres así que usaremos un varchar(8).

FizzBuzz-1

Paso 2: Cargar la secuencia de números

Con la tabla ya creada vamos a empezar a cargar los datos, lo primero será cargar los números que luego vamos a evaluar. Para ello empezamos con la sintaxis INSERT INTO ya que la tabla existe de antes. A este insert le vamos a pasar el resultado de una función de tabla que se ha introducido nueva en SQL Server 2022, GENERATE_SERIES. Esta función tendrá como primer parámetro el primer número de nuestra cadena, como segundo el último y, opcionalmente, como tercero el número en el que se va a incrementar el contador. Como este tercer parámetro es opcional y si no ponemos nada va de uno en uno lo vamos a omitir.

FizzBuzz-2

Paso 3: Algoritmo FizzBuzz

Llegó el momento de la verdad, hasta ahora solo habíamos preparado el escenario. Tenemos que actualizar nuestra tabla para poner los valores Fizz, Buzz o FizzBuzz cuando sea necesario. Lo primero que tendremos que saber es que en SQL Server podemos usar el operador % para devolver el resto de una división, por lo que si este es igual a 0 será que el número es múltiplo del dividendo que estemos comparando. Una vez tenemos eso resulto nos encontramos con el siguiente reto, para hacerlo de una sola vez tendremos que usar la sintaxis de UPDATE con un CASE dentro de la cláusula SET

Hacer correctamente el case será nuestro tercer desafío, como sabéis, esta operación evalúa las condiciones en orden y si la primera de ellas se cumple ya no va a pasar por las siguientes. Esto hace que si o si tengamos que empezar por el caso de que un número sea múltiplo de 3 y de 5. A continuación ya podremos evaluar que sea múltiplo de 3 o de 5 en orden indistinto. Para terminar tenemos que devolver el mismo valor si no se ha cumplido con ninguna de las tres condiciones anteriores lo que nos puede dar más de un quebradero de cabeza si no estamos atentos. El tipo de datos del valor que estamos evaluando (el número) no se puede insertar en un campo de texto, antes tendremos que convertirlo o nos encontraremos con un error en la ejecución.

FizzBuzz-3

Paso 4: Mostrar los resultados

Ya hemos hecho lo difícil, ahora solo nos queda mostrar los resultados de nuestro trabajo.

FizzBuzz-4

Código de FizzBuzz

Ahora que ya hemos resuelto el desafío te dejo el código completo que he utilizado para que lo puedas copiar, editar e investigar tu mismo otras variaciones.

Conclusión

Así, de una manera sencilla y eficiente hemos resuelto el reto FizzBuzz en T-SQL, espero que te haya servido para aprender aunque sea alguna sintaxis que no conocías. ¿Se te ocurre otra solución posible? ¿Te apetece que hagamos más desafíos de este tipo? Pónmelo en comentarios y lo tendré muy en cuenta.

Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio

Mi nombre es Roberto Carrancio y soy un DBA de SQL server con más de 10 años de experiencia en el sector. Soy el creador del blog soydba.es donde intento publicar varios artículos a la semana (de lunes a viernes que los fines de semana me gusta estar con mi gente y disfrutar de mi moto) Espero que disfrutes leyendo este blog tanto como yo disfruto escribiendo y que te sea de utilidad. Si tienes alguna sugerencia, pregunta o comentario, puedes dejarlo al final de cada entrada o enviarme un correo electrónico. Estaré encantado de leerte y responderte. ¡Gracias por tu visita! Mi principal interés es compartir mi conocimiento sobre bases de datos con todo el que quiera aprenderlo. Me parece un mundo tan apasionante como desconocido. Fuera de lo profesional me encanta la cocina, la moto y disfrutar de tomar una cervecita con amigos.

2 comentarios

El artículo es muy interesante y como siempre, contribuye a mejorar a la comunidad. Por aquí dejo mi pequeño granito de arena, realizando el test con una estructura IF

— Creamos la base de datos y la tabla

CREATE DATABASE GENERATE_SERIES
USE GENERATE_SERIES
GO

DROP TABLE IF EXISTS FizzBuzz
CREATE TABLE FizzBuzz (Numero tinyint, Resultado varchar(8))

— Declaramos las variables

DECLARE @numero INT = 1;
DECLARE @valor NVARCHAR(8);

— Establecemos el bucle para completar el test FizzBuzz

WHILE @numero <= 100
BEGIN
IF @numero % 3 = 0 AND @numero % 5 = 0
SET @valor = 'FizzBuzz';
ELSE IF @numero % 3 = 0
SET @valor = 'Fizz';
ELSE IF @numero % 5 = 0
SET @valor = 'Buzz';
ELSE
SET @valor = CAST(@numero AS NVARCHAR(8));

INSERT INTO FizzBuzz (Numero, Resultado) VALUES (@numero, @valor);

SET @numero = @numero + 1;
END;

Perfectamente explicado. Gracias por unirte al reto

Deja una respuesta