none
como saber el dato minimo y maximo en un renglon que tiene 20 columnas RRS feed

  • Pregunta

  • En la imagen quiciera saber cual es el valor máximo y mínimo para cada folio por ejemlo pasa el 151643 max:10 min:2 y para 152718 es max 5  min 1 así para toda la tabla  el nombre de la columna lo obtuve así porque es  el resultado de una tabla pivot

    viernes, 11 de diciembre de 2020 0:45

Todas las respuestas

  • Hola netnahual:

    En el hilo, al menos de momento, no se ve ninguna imagen:

    Si la has pegado directamente, no sube. Tienes que anexarla utilizando el botón de la barra.

    el nombre de la columna lo obtuve así porque es el resultado de una tabla pivot

    Pero ¿después de hacer el pivot, lo tienes en una estructura estática (tabla o variable de tabla)?

    ¿El pivot es dinámico?

    Quizá si pegas la query que hace el pivot, podríamos ayudarte mejor.

    viernes, 11 de diciembre de 2020 5:30
  • Si la has pegado directamente, no sube. Tienes que anexarla utilizando el botón de la barra.

    No podrá. Fíjate que netnahual tiene 0 puntos. El foro no te deja subir imágenes hasta que alcanzas un cierto número mínimo de puntos.

    > el nombre de la columna lo obtuve así porque es  el resultado de una tabla pivot

    Si es el resultado de un Pivot, yo sugeriría que busques el máximo directamente en la tabla original, antes de hacerle el Pivot. Basta con que hagas un select Max(...) sobre la columna que estás pivotando, con un Group By sobre el campo usado para pivotar.

    viernes, 11 de diciembre de 2020 10:25
  • Hola, en efecto no me dejo subir la imagen pero la tabla es el producto de un pivot entonces por eso se generaron 20 columnas lo que necesito saber es cual es el maximo y minimo de esas 20 columnas del mismo renglon a ver si se ve mas o  menos a estructura de la tabla:

     

    folio      |col1  |col2  |col3 |col4 |col5 |col6 |col7| .....     | col20    | maximo  | minimo

    12345  |1      |        |        |    4  |      |        |       | . . . .  | col 20    |   4         |    1

    12347   |      | 2       |        |      |      |        |   7    | . . . .  | col 20    |  7         |    2

    la idea es agregar esas columnas max y min y que me diga los valores , gracias gurus!

    viernes, 11 de diciembre de 2020 20:06
  • Hola, en efecto no me dejo subir la imagen pero la tabla es el producto de un pivot entonces por eso se generaron 20 columnas lo que necesito saber es cual es el maximo y minimo de esas 20 columnas del mismo renglon a ver si se ve mas o  menos a estructura de la tabla:

     

    folio      |col1  |col2  |col3 |col4 |col5 |col6 |col7| .....     | col20    | maximo  | minimo

    12345  |1      |        |        |    4  |      |        |       | . . . .  | col 20    |   4         |    1

    12347   |      | 2       |        |      |      |        |   7    | . . . .  | col 20    |  7         |    2

    la idea es agregar esas columnas max y min y que me diga los valores , gracias gurus!

    este es el pivot que genera la tabla:

    SELECT folio, [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20]
    FROM  
    (SELECT folio,[cant1]
     FROM STR_MP_BONIFICACIONES_RENGLON_COLUMNA) AS SourceTable  
    PIVOT  
    (  
     max(cant1)
    FOR cant1 IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20])  
    ) AS PivotTable;  

    viernes, 11 de diciembre de 2020 20:08
  • Digamos que estoy buscando algo parecido a la función MAX(a1:a20) de excel que te trae el valor máximo de un rango de datos que en este caso son las 20 columnas

    viernes, 11 de diciembre de 2020 20:20
  • Digamos que estoy buscando algo parecido a la función MAX(a1:a20) de excel que te trae el valor máximo de un rango de datos que en este caso son las 20 columnas
    viernes, 11 de diciembre de 2020 20:20
  • Hola netnahual:

    Puedes hacerlo con un case.

    create table dbo.ejPvt (folio varchar(15), colNum tinyint);
    go
    Insert into dbo.ejPvt(folio, colNum)
    values
    ('12345',1),
    ('12345',4),
    ('12345',4),
    ('12345',4),
    ('12345',4),
    ('12345',7),
    ('12345',7),
    ('12345',7),
    ('12345',7),
    ('12345',7),
    ('12345',7),
    ('12345',7),
    ('12347',2),
    ('12347',2),
    ('12347',7),
    ('12347',7),
    ('12347',7),
    ('12347',7),
    ('12347',7),
    ('12347',7),
    ('12347',7);
    go
    

    Suponiendo que tienes un pivot estático tal que:

    Select *
    from
    (
    	select * from dbo.ejPvt t
    )as source
    pivot (max(colnum) for colnum in 
    ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])) as p


    Como puedes ver, aunque la consulta no es idéntica, el escenario es el mismo, pero con 10 columnas.

    Create  dbo.isMayor (
    	@a1 tinyint, 
    	@a2 tinyint, 
    	@a3 tinyint,
    	@a4 tinyint, 
    	@a5 tinyint, 
    	@a6 tinyint,
    	@a7 tinyint, 
    	@a8 tinyint, 
    	@a9 tinyint,
    	@a10 tinyint
    	)
    returns tinyint
    as
    begin
    Select  @a1=  ISNULL(@a1,0),
    		@a2=  ISNULL(@a2,0),
    		@a3=  ISNULL(@a3,0),
    		@a4=  ISNULL(@a4,0),
    		@a5=  ISNULL(@a5,0),
    		@a6=  ISNULL(@a6,0),
    		@a7=  ISNULL(@a7,0),
    		@a8=  ISNULL(@a8,0),
    		@a9=  ISNULL(@a9,0),
    		@a10= ISNULL(@a10,0);
    return
    (
    select case when  @a1> @a2 and @a1> @a3 and @a1>@a4 and @a1>@a5 and @a1>@a6 and @a1>@a7 and @a1>@a8 and @a1>@a9 and @a1>@a10 then @a1
    			when			   @a2> @a3 and @a2>@a4 and @a2>@a5 and @a2>@a6 and @a2>@a7 and @a2>@a8 and @a2>@a9 and @a2>@a10 then @a2
    			when						    @a3>@a4 and @a3>@a5 and @a3>@a6 and @a3>@a7 and @a3>@a8 and @a3>@a9 and @a3>@a10 then @a3
    			when										@a4>@a5 and @a4>@a6 and @a4>@a7 and @a4>@a8 and @a4>@a9 and @a4>@a10 then @a4
    			when													@a5>@a6 and @a5>@a7 and @a5>@a8 and @a5>@a9 and @a5>@a10 then @a5
    			when																@a6>@a7 and @a6>@a8 and @a6>@a9 and @a6>@a10 then @a6
    			when																			@a7>@a8 and @a7>@a9 and @a7>@a10 then @a7
    			when																						@a8>@a9 and @a8>@a10 then @a8
    			when																								    @a9>@a10 then @a9
    																														else @a10 end 
    																															as maximo
    );
    end;
    go

    Creas una función, que obtiene el mayor, para tener el código empaquetado, aunque tambíén la puedes hacer directamente en la select.

    Haces lo mismo para el menor.

    Create function dbo.isMenor (
    	@a1 tinyint, 
    	@a2 tinyint, 
    	@a3 tinyint,
    	@a4 tinyint, 
    	@a5 tinyint, 
    	@a6 tinyint,
    	@a7 tinyint, 
    	@a8 tinyint, 
    	@a9 tinyint,
    	@a10 tinyint
    	)
    returns tinyint
    as
    begin
    Select  @a1=  ISNULL(@a1,255),
    		@a2=  ISNULL(@a2,255),
    		@a3=  ISNULL(@a3,255),
    		@a4=  ISNULL(@a4,255),
    		@a5=  ISNULL(@a5,255),
    		@a6=  ISNULL(@a6,255),
    		@a7=  ISNULL(@a7,255),
    		@a8=  ISNULL(@a8,255),
    		@a9=  ISNULL(@a9,255),
    		@a10= ISNULL(@a10,255);
    return
    (
    select case when  @a1<= @a2 and @a1<= @a3 and @a1<=@a4 and @a1<=@a5 and @a1<=@a6 and @a1<=@a7 and @a1<=@a8 and @a1<=@a9 and @a1<=@a10 and @a1>0 then @a1
    			when			    @a2<= @a3 and @a2<=@a4 and @a2<=@a5 and @a2<=@a6 and @a2<=@a7 and @a2<=@a8 and @a2<=@a9 and @a2<=@a10 and @a2>0 then @a2
    			when						      @a3<=@a4 and @a3<=@a5 and @a3<=@a6 and @a3<=@a7 and @a3<=@a8 and @a3<=@a9 and @a3<=@a10 and @a3>0 then @a3
    			when										   @a4<=@a5 and @a4<=@a6 and @a4<=@a7 and @a4<=@a8 and @a4<=@a9 and @a4<=@a10 and @a4>0 then @a4
    			when													    @a5<=@a6 and @a5<=@a7 and @a5<=@a8 and @a5<=@a9 and @a5<=@a10 and @a5>0 then @a5
    			when																     @a6<=@a7 and @a6<=@a8 and @a6<=@a9 and @a6<=@a10 and @a6>0 then @a6
    			when																			      @a7<=@a8 and @a7<=@a9 and @a7<=@a10 and @a7>0 then @a7
    			when																						       @a8<=@a9 and @a8<=@a10 and @a8>0 then @a8
    			when																								            @a9<=@a10 and @a9>0 then @a9
    																														                    else @a10 end 
    																															as minimo
    );
    end;
    go

    Como ves, yo he usado tinyint, y el valor máximo es el que inicializo en la función. 

    Y luego solo tienes que consumirlas con los valores que tiene la fila.

    Select *
    	, dbo.isMayor(p.[1],p.[2],p.[3],p.[4],p.[5],p.[6],p.[7],p.[8],p.[9],p.[10]) as mayor	
    	, dbo.isMenor(p.[1],p.[2],p.[3],p.[4],p.[5],p.[6],p.[7],p.[8],p.[9],p.[10]) as menor
    from
    (
    	select * from dbo.ejpvt t
    )as source
    pivot (max(colnum) for colnum in 
    ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])) as p
    

    Ahora solo te queda adaptarla a los tipos de datos que tienes en tus tablas y completarla hasta 20 campos.

    sábado, 12 de diciembre de 2020 7:01