none
Problema con Group by en Sql Server al hacer la consulta..... RRS feed

  • Pregunta

  • Estimados estoy haciendo una consulta  sobre sql server  y neceto rescatar solo el valor maximo de cada id_estado para cada id_sumario, ocupando un group by me permite rescatar el id_estado mas el id_sumario, pero si quiero rescatar tambien el campo estado me exigue que este en el group by , pero al agregarlo la consulta pierde el sentido por que aparecen todos los registros.

    select 
    MAX(t1.id_estado),
    t1.id_sumario,

    t1.estado

    from 
    testado t1
    group by t1.id_sumario

    desde ya muchas gracias, se que esto para algunos puede ser algo muy facil , pero yo ya llevo un dia y medio buscando una solucion.....

    jueves, 12 de febrero de 2015 1:39

Respuestas

  • Hola,

    Intenta hacer lo siguiente, te dejo datos de prueba.

    declare @Prueba table (id_sumario int, id_estado int, estado nvarchar(10));
    insert into @Prueba values
    	(1, 1, 'A'),
    	(1, 2, 'B'),
    	(1, 3, 'C'),
    	(1, 4, 'D'),
    	(1, 5, 'E'),
    	(2, 1, 'F'),
    	(2, 2, 'G'),
    	(2, 3, 'H'),
    	(2, 4, 'I'),
    	(2, 5, 'J');
    with DataSource as (
    select
    	id_sumario,
    	id_estado,
    	estado,
    	row_number() over (partition by id_sumario order by id_estado desc) [orden]
    from
    	@Prueba)
    select
    	id_sumario,
    	id_estado,
    	estado
    from
    	DataSource
    where
    	orden = 1;

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Marcado como respuesta ilich Hernandez jueves, 12 de febrero de 2015 2:00
    jueves, 12 de febrero de 2015 1:53

Todas las respuestas

  • Hola,

    Intenta hacer lo siguiente, te dejo datos de prueba.

    declare @Prueba table (id_sumario int, id_estado int, estado nvarchar(10));
    insert into @Prueba values
    	(1, 1, 'A'),
    	(1, 2, 'B'),
    	(1, 3, 'C'),
    	(1, 4, 'D'),
    	(1, 5, 'E'),
    	(2, 1, 'F'),
    	(2, 2, 'G'),
    	(2, 3, 'H'),
    	(2, 4, 'I'),
    	(2, 5, 'J');
    with DataSource as (
    select
    	id_sumario,
    	id_estado,
    	estado,
    	row_number() over (partition by id_sumario order by id_estado desc) [orden]
    from
    	@Prueba)
    select
    	id_sumario,
    	id_estado,
    	estado
    from
    	DataSource
    where
    	orden = 1;

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Marcado como respuesta ilich Hernandez jueves, 12 de febrero de 2015 2:00
    jueves, 12 de febrero de 2015 1:53
  • Estimado, muchas gracias por la informacion, he probado con los datos de prueba y efectivamente aparecen los datos de los que requiero....pero agradeceria me pudieras comentar eso del Datasource  y el over partition que no los habia visto nunca...... desde ya muchas gracias.
    jueves, 12 de febrero de 2015 2:00
  • Hola ilich,

    Te dejo la documentación necesaria que te permitirá inducirte:

    Clausula WITH

    Clausula OVER

    jueves, 12 de febrero de 2015 2:03
  • Quizas te rias pero, como hago para que esto funcione con mis tablas.....he estado viendo la documentacion que me mencionaste anteriormente y en realidad no es como para digerirla tan rapido.....  :-)

    Saludos

    jueves, 12 de febrero de 2015 2:08
  • ilich,

    Deberías tomar más en serio tu profesión y echarle un poco mas de intención. No es tan complicado esto, vamos hombre, quemate las pestañas si quieres ser el mejor!

    A ver, te va a parecer mas gracioso de lo simple que es acomodar tu caso sobre el ejemplo que te puse.

    with DataSource as (
    select
    	id_sumario,
    	id_estado,
    	estado,
    	row_number() over (partition by id_sumario order by id_estado desc) [orden]
    from
    	testado)
    select
    	id_sumario,
    	id_estado,
    	estado
    from
    	DataSource
    where
    	orden = 1;

    Si te das cuenta no hice mayor cambio. Lo importante es que lo entiendas.

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    jueves, 12 de febrero de 2015 2:19
  • Estimado, hice una pequeña adaptacion y me ha funcionado de manera perfecta, muchas gracias

    <SQL>

    declare @Prueba2 table (id_sumario int, id_estado int, estado nvarchar(1000));
    insert into @Prueba2 select id_sumario,id_estado,estado from testado;

    with DataSource as (
    select
    id_sumario,
    id_estado,
    estado,
    row_number() over (partition by id_sumario order by id_estado desc) [orden]
    from
    @Prueba2)
    select
    id_sumario,
    id_estado,
    estado
    from
    DataSource
    where
    orden = 1;

    </SQL>

    jueves, 12 de febrero de 2015 2:22
  • Hola,

    Muy bien, pero,¿para que haces uso de la variable @Prueba2? ¿Por qué no trabajas de manera directa con testado?

    En el primer ejemplo que te propuse hice uso de una variable de tipo table para hacer pruebas y mostrarte una solución funcionando, recuerda que yo no tengo tus tablas por tanto no tengo como probar lo que sugiero. En tu caso no hay necesidad de usar una variable de tipo tabla. No, sí te das cuenta que lo que haces es copiar los datos de testado a @table2 y luego operar con @table2, ¿tiene sentido?, ninguno, trabaja de manera directa con la tabla testado.

    jueves, 12 de febrero de 2015 2:44
  • Estimado.....sigo trabajando aun en el temita.....he llegado a esto para agregarle unos datos de otra tabla...ahora entiendo un poco como va el tema....pero me asalta una duda distinta.....si yo quisiera volcar esa salida en una tabla temporal....como cuando uno usa el Select INTO donde deberia colocar el INTO....intente despues del from  Datasource pero me arroja error ....de echo no se si se puede hacer esto..... saludos y evidentemente muchas gracias por tu colaboracion y tiempo.

    <SLQ>

    with DataSource as (
    select
    id_sumario,
    id_estado,
    estado,

    row_number() over (partition by id_sumario order by id_estado desc) [orden]
    from
    testado)
    select
    id_sumario,
    id_estado,
    estado,
    (Select Trabajador from TSumarios where TSumarios.id = DataSource.id_sumario)as Trabajador,
    (Select TSumarios.fiscal from TSumarios where TSumarios.id = DataSource.id_sumario) as Fiscal,
    (Select TSumarios.fecter from TSumarios where TSumarios.id = DataSource.id_sumario) as fecter 

    from
    DataSource
    where
    orden = 1

    </SQL>

    jueves, 12 de febrero de 2015 3:14
  • Hola,

    Es que no se coloca luego del from, sino antes del from

    select * into NuevaTabla from Tabla

    jueves, 12 de febrero de 2015 3:59