Agrupar registro en SQL (Cláusula Group BY)

Como su nombre lo indica la cláusula GROUP BY agrupa los registros que tengan un mismo valor en la/s colnma/s indocadas como grupo.Por ejemplo, si queremos obtener el apellido de todos los mienbros del club ejecutaría una sentencia como la que sigue:

SELECT apellido FROM miembros

Supongamos que tenemos varios miembros con el mismo apellido , esto nos daría filas repetidas. Ahora, si lo que nos interesa es obtener solo los apellidos que sean distintos. Para ello necesitamos agrupar los miembros que tengan el mismo apellido en un grupo y mostrar el grupo en lugar de las filas.

SELECT apellido FROM miembros GROUP BY apellido

Veamos ahora un ejemplo más práctico con el agregado de, por ejemplo, la función SUM.

Quiero saber cuanto es lo que se cobra de cuota por cada categoría. Entonces necesitaría listar todos los miembro agruparlos por categoría y sumar las cuotas de cada uno. Puedo hacer todo eso on una sola instrucción:

SELECT Categoria, sum(cuota) as importe FROM miembros GROUP BY categoria

Esta cláusla es muy útil y usarla no requiere más que un poco de práctica para poder entender su funcionamiento.

Espero que les sirva.



7 Responses to “Agrupar registro en SQL (Cláusula Group BY)”

  1. Información Bitacoras.com…

    Valora en Bitacoras.com: Como su nombre lo indica la cláusula GROUP BY agrupa los registros que tengan un mismo valor en la/s colnma/s indocadas como grupo.Por ejemplo, si queremos obtener el apellido de todos los mienbros del club ejecutaría una sen…

  2. pATTY dice:

    QUE PASA SI QUIERES MOSTRAR MAS DE UNA columna en el select X EJEMPLO :

    nro_nota_venta subtotal descuento TOTAL
    ————————————————– ——————— ——————— ———————
    001 – 5059252 60,00 0,00 60,00
    466- 112 40,00 20,00 20,00
    466- 112 80,00 0,00 80,00

    USANDO ESTA SENTENCIA NO LOGRO Q SE MUSTRE UNA UNICA NOTA DE VENTA

    SELECT [nro_nota_venta]
    ,[subtotal]
    ,[descuento]
    ,SUM([total]) AS TOTAL
    FROM [TheStage].[dbo].[Nota_Venta]
    GROUP BY [nro_nota_venta],[subtotal],[descuento]

    EN CAMBIO SI PONGO ESTA SENTENCIA

    SELECT [nro_nota_venta]
    ,SUM([total]) AS TOTAL
    FROM [TheStage].[dbo].[Nota_Venta]
    GROUP BY [nro_nota_venta]
    EL RESULTADO ES EL QUE QUIERO, PERO YO NO SOLO QUIERO MOSTRAR ESAS COLUMNAS SINO LAS DEMAS DEL 1ER EJEMPLO

    nro_nota_venta TOTAL
    ————————————————– ———————
    001 – 5059252 60,00
    466- 112 100,00

    COMO PUEDO HACER PARA QUE SOLO SE MUESTRE UNA SOLA NOTA DE VENTA

    • Eliseo dice:

      La primer instrucción es correcta. Y te muestra el nro de nota de venta duplicado porque no solo estás agrupando por este código sino por la combinación de nro+subtotal+descuento y si te fijas bien en todos los registros devueltos esa combinación es única.
      Prueba con esto:
      SELECT [nro_nota_venta]
      ,SUM[subtotal] as subtotal
      ,SUM[descuento] as descuento
      ,SUM([total]) AS TOTAL
      FROM [TheStage].[dbo].[Nota_Venta]
      GROUP BY [nro_nota_venta]

      Suerte.

  3. leonardo dice:

    quisiera saber como puedo sumar dos o mas columnas. el ejemplo es el siguiente estoy registrando dinero y quiero q me selecciones toda la columna y la sume para saber un total

  4. Colby dice:

    This is the main reason I like http://www.solovb.net. Aweosme post.

  5. Lissette dice:

    Tengo un problema, tengo una consulta que me muestra los valores repetidos porque tengo un intervalo de tiempo, aqui les pongo lo que me sucede

    Select S.Nombre,Nomb_prov,idprovincia,CapE=COALESCE((Select Sum(CapEmbarazadas)from nacidos as N
    where N.Ano=A.Ano and N.idsucursal=A.idsucursal and A.idprovincia=N.idprovincia),0),
    Estudiadas=COALESCE(Sum(Estudiadas),0),
    NoEstudiadas=COALESCE((Select Sum(CapEmbarazadas)from nacidos as N where N.Ano=A.Ano
    and N.idsucursal=A.idsucursal and A.idprovincia=N.idprovincia)-Sum(Estudiadas),0),
    Cobertura=COALESCE(Convert(decimal(5,2),COALESCE(Sum(Estudiadas),0)/
    Convert(Real,(Select Sum(CapEmbarazadas) from nacidos as N where N.Ano=A.Ano
    and N.idsucursal=A.idsucursal and A.idprovincia=N.idprovincia))),0)*100
    From Progesterona A,Provincias as P,Clientes as S where
    A.idprovincia=P.Cod_Prov and Id_pais=’CU’ and A.Ano between ’2009′ and ’2010′and A.idlaboratorio=CodCliente
    Group by A.idsucursal,Nomb_prov,A.idprovincia,S.nombre,A.ano

    Esto es lo que me muestra

    CEPAI Jatibonico (Pol. Doc. Antonio Avila Valdivia) Sancti Sp¡ritus 7 0 15 0 0.00
    CEPAI Caibari‚n (CMHE) Villa Clara 6 0 22 0 0.00
    DAVIHLAB La Habana 2 410 5 405 1.00
    Hosp. Artemisa La Habana 2 0 2 0 0.00
    Hosp. Artemisa La Habana 2 410 20 390 5.00
    Hosp. Sandino Pinar del R¡o 1 0 20 0 0.00
    Hosp. Sandino Pinar del R¡o 1 660 20 640 3.00

    Como ven Hospital de Artemisa y Sandino me salen repetidos porque ambos tienen valor en el 2009 y 2010. Como puedo lograr que solo me salga una vez con los valores sumados??

    • Eliseo dice:

      Por lo que puedo ver estas agrupando por tres campos (Group by A.idsucursal,Nomb_prov,A.idprovincia,S.nombre,A.ano) te agrupará todos los registros donde “los tres” campos tengan el mismo dato, cosa que no sucede en el ejemplo que mostras dado que aunque el hospital es el mismo hay uno de los campos que contiene un dato distinto.

      Saludos

      Eliseo

Comentar