¿Una pequeña ayuda? Programacion SQL Server

20.-Construir un programa que genere un número aleatorio entre 1 y 10. Si el número es 1,2 ó 3, que se visualicen tantos * como indique su valor. Si el número es 4, 5 ó 6, que se visualicen tantas # como indique su valor. Si el número es 7, 8 ó 9, que se visualice el número aleatorio tantas veces como indique su valor. Si el número es el 10 que se visualice la expresión ‘VALOR MÁXIMO’.
Por ejemplo:
Si sale un 2, se visualizará **
Si sale un 6, se visualizará ######
Si sale un 7, se visualizará 7777777
Y si sale un 10, se visualizará VALOR MÁXIMO


Mi código es el siguiente:

declare @a int,@b varchar(20),@c int
set @a=rand()*10+1
set @b=''
set @c=0
if @a < 4
   while @c<@a
      begin
         set @b=@b+'*'
         set @c=@c+1
      end
      set @c=''
if @a>=4 and @a<7
      while @c<@a
      begin
         set @b=@b+'#'
         set @c=@c+1
      end
      set @c=''
if @a>=7 and @a<10
      while @c<@a
      begin
         while @b=@a
            begin
               print @b
               set @b=@b+1
            end
         set @c=@c+1
      end
      set @c=''
if @a=10
   set @b='VALOR MAXIMO'
   
print @a
print @b


Mi problema es que en la parte de si @a es mayor que 7 y menor que diez, no se como hacer que salga tanto números como valor tenga, si alguien me puede echar una mano se lo agradecería ;)
partiendo de la base que nunca he programado en sql server....

viendo el enunciado no entiendo por que esos if <4 y demas... (por que separas en grupos??)

no seria mejor algo asi?? (escribo un pseudocodigo)


for (int i=0;i<10;i++) //para hacer lo mismo las 10 veces
{
int a=random(); //el numero aleatorio generado
int contador=a; //para ver cuantas veces debo escribir ese numero
string salida=""; //donde voy acumulando los numeros para imprimir
while (contador>0)
{
salida=salida+a;
contador=contador-1;
}
print salida;//imprimo al final
}


hace mil años que no programo.... pero creo que deberia ser algo como esto....
wolf_ou escribió:partiendo de la base que nunca he programado en sql server....

viendo el enunciado no entiendo por que esos if <4 y demas... (por que separas en grupos??)

no seria mejor algo asi?? (escribo un pseudocodigo)


for (int i=0;i<10;i++) //para hacer lo mismo las 10 veces
{
int a=random(); //el numero aleatorio generado
int contador=a; //para ver cuantas veces debo escribir ese numero
string salida=""; //donde voy acumulando los numeros para imprimir
while (contador>0)
{
salida=salida+a;
contador=contador-1;
}
print salida;//imprimo al final
}


hace mil años que no programo.... pero creo que deberia ser algo como esto....


Me equivoque en el enunciado, error mio ya esta editado.
No he tocado nunca este lenguaje, pero en el tercer caso estás tratando el número como número, cuando lo necesitas como carácter (para que, si es un 7, concatene con otros 7's en lugar de "autosumarse").

Ahora, lo que necesitas saber es la forma de convertir un valor numérico a alfanumérico. Por lo visto existen las funciones CAST y CONVERT, infórmate sobre ellas y probablemente alguna de las dos te sirva XD
Te sobra el segundo bucle, de hecho podrías hacerlo de la misma manera que tienes los otros dos casos, sólo que en lugar de ir concatenando un asterisco o una almohadilla concatenas el propio número.

Por cierto acotsúmbrate a ponerle nombres descriptivos a las variables, te ayudará bastante a ti y a todo el que lea tu código.
Al final lo he sacado así, no se si estará todo correcto... pero funcionar funciona al menos
declare @a int,@b varchar(20),@c int,@d varchar(10)
set @a=rand()*10+1
set @b=''
set @c=0
set @d=@a
if @a < 4
   while @c<@a
      begin
         set @b=@b+'*'
         set @c=@c+1
      end
      set @c=''
if @a>=4 and @a<7
      while @c<@a
      begin
         set @b=@b+'#'
         set @c=@c+1
      end
      set @c=''
if @a>=7 and @a<10
      while @c<@a
      begin
         set @b=@b+@d
         set @c=@c+1
      end
      set @c=''
if @a=10
   set @b='VALOR MAXIMO'
   
print @a
print @b
Nunca he programado en SQL Server (lo mío es el PLSQL / Oracle) y pensando en la función LPAD de estos lenguajes he investigado y he encontrado la función REPLICATE que parece existir en SQL Server. Con esta función quedaría simplemente:


declare @a int,@b varchar(20)
set @a=rand()*10+1
set @b=''
if @a < 4
   set @b=REPLICATE('*',@a)
if @a>=4 and @a<7
   set @b=REPLICATE('#',@a)
if @a>=7 and @a<10
   set @b=REPLICATE(CAST(@a as varchar),@a)
if @a=10
   set @b='VALOR MAXIMO'
   
print @a
print @b


Lo que no sé es si realmente esta función se puede usar fuera de SELECT [+risas]

[https://docs.microsoft.com/es-es/sql/t-sql/functions/replicate-transact-sql]
Metalhead escribió:Por cierto acotsúmbrate a ponerle nombres descriptivos a las variables, te ayudará bastante a ti y a todo el que lea tu código.
Amén [oki]


Ruben[FF]NEO escribió:Lo que no sé es si realmente esta función se puede usar fuera de SELECT [+risas]
Con el SET a secas no se puede, a no ser que hagas algo así, por ejemplo, pero en este caso concreto no tendría sentido:
SET @a = (SELECT REPLICATE('*', 2))


@fraan123 Como te apunta el compañero, con la función REPLICATE te queda más sencillo. A partir de ahí, se puede simplificar un poco más si eliminamos los set y alguna comprobación:
DECLARE
    @_min TINYINT = 1,
    @_max TINYINT = 10

DECLARE @_random TINYINT = ROUND(((@_max - @_min) * RAND() + @_min), 0)

SELECT
  @_random AS RandomNumber,
  CASE
    WHEN @_random < 4 THEN
      REPLICATE('*', @_random)
    WHEN @_random < 7 THEN
      REPLICATE('#', @_random)
    WHEN @_random < 10 THEN
      REPLICATE(CAST(@_random AS VARCHAR(1)), @_random)
    ELSE
      'Valor máximo'
  END AS GeneratedString

Esos guiones bajos en los nombres de las variables son para evitar menciones a usuarios del foro con nombres "originales" :Ð
7 respuestas