Agrupar registre en SQL (clàusula Group BY)

Com el seu nom ho indica la clàusula GROUP BY agrupa els registres que tinguin un mateix valor en la / les colnma / es indocadas com grupo.Por exemple, si volem obtenir el cognom de tots els mienbros del club s'executaria una sentència com aquesta:

 SELECT cognom FROM membres

Suposem que tenim diversos membres amb el mateix cognom, això ens donaria files repetides. Ara, si el que ens interessa és obtenir només els cognoms que siguin diferents. Per això necessitem agrupar els membres que tinguin el mateix cognom en un grup i mostrar el grup en lloc de les files.

 SELECT cognom FROM membres GROUP BY cognom

Vegem ara un exemple més pràctic amb l'agregat de, per exemple, la funció SUM.

Vull saber quant és el que es cobra de quota per cada categoria. Llavors necessitaria llistar tots els membre agrupar-los per categoria i sumar les quotes de cada un. Puc fer tot això on una sola instrucció:

 SELECT Categoria, sum (quota) es import FROM membres GROUP BY categoria

Aquesta cláusla és molt útil i usar-la no requereix més que una mica de pràctica per poder entendre el seu funcionament.

Espero que els serveixi.

7 Responses to "Agrupar registre en SQL (clàusula Group BY)"

  1. Informació Bitacoras.com ...

    Valora en Bitacoras.com: Com el seu nom ho indica la clàusula GROUP BY agrupa els registres que tinguin un mateix valor en la / les colnma / es indocadas com grupo.Por exemple, si volem obtenir el cognom de tots els mienbros del club executaria una sin ...

  2. PATTY diu:

    QUE PASSA SI VOLS MOSTRAR MÉS D'UNA columna al select X EXEMPLE:

    nro_nota_venta subtotal descompte TOTAL
    --------------------------------------
    001-5.059.252 60,00 0,00 60,00
    466-112 40,00 20,00 20,00
    466-112 80,00 0,00 80,00

    USANT AQUESTA SENTÈNCIA NO ASSOLIMENT Q ES MUSTRE UNA ÚNICA NOTA DE VENDA

    SELECT [nro_nota_venta]
    , [Subtotal]
    , [Descompte]
    , SUM ([total]) AS TOTAL
    FROM [TheStage]. [Dbo]. [Nota_Venta]
    GROUP BY [nro_nota_venta], [subtotal], [descompte]

    EN CANVI SI POSO AQUESTA SENTÈNCIA

    SELECT [nro_nota_venta]
    , SUM ([total]) AS TOTAL
    FROM [TheStage]. [Dbo]. [Nota_Venta]
    GROUP BY [nro_nota_venta]
    EL RESULTAT ÉS EL QUE VULL, PERÒ JO NO NOMÉS VULL MOSTRAR AQUESTES COLUMNES SINÓ LES ALTRES DEL 1ER EXEMPLE

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

    COM PUC FER PERQUÈ NOMÉS ES MOSTRI UNA NOTA DE VENDA

    • Eliseu diu:

      La primera instrucció és correcta. I et mostra el nro de nota de venda duplicat perquè no només estàs agrupant per aquest codi sinó per la combinació de nro + subtotal + descompte i si et fixes bé en tots els registres retornats aquesta combinació és única.
      Prova amb això:
      SELECT [nro_nota_venta]
      , SUM [subtotal] es subtotal
      , SUM [descompte] es descompte
      , SUM ([total]) AS TOTAL
      FROM [TheStage]. [Dbo]. [Nota_Venta]
      GROUP BY [nro_nota_venta]

      Sort.

  3. leonardo diu:

    voldria saber com puc sumar dos o més columnes. l'exemple és el següent estic registrant diners i vull q em seleccions tota la columna i la sumi per saber una total

  4. Colby diu:

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

  5. Lissette diu:

    Tinc un problema, tinc una consulta que em mostra els valors repetits perquè tinc un interval de temps, aqui els poso el que em passa

    Select S.Nombre, Nomb_prov, idprovincia, Cape = COALESCE ((Select Sum (CapEmbarazadas) from nascuts des N
    where N.Ano = A.Ano and N.idsucursal = A.idsucursal and A.idprovincia = N.idprovincia), 0),
    Estudiades = COALESCE (Sum (Estudiades), 0),
    NoEstudiadas = COALESCE ((Select Sum (CapEmbarazadas) from nascuts des N where N.Ano = A.Ano
    and N.idsucursal = A.idsucursal and A.idprovincia = N.idprovincia)-Sum (Estudiades), 0),
    Cobertura = COALESCE (Convert (decimal (5,2), COALESCE (Sum (Estudiades), 0) /
    Convert (Reial, (Select Sum (CapEmbarazadas) from nascuts des N where N.Ano = A.Ano
    and N.idsucursal = A.idsucursal and A.idprovincia = N.idprovincia))), 0) * 100
    From Progesterona A, Províncies es P, Clients es 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

    Això és el que em mostra

    CEPAI Jatibonico (Pol Doc Antonio Àvila Valdivia) Sancti Sp ¡ritus 7 0 15 0 0,00
    CEPAI Caibari, n (CMHE) Vila Clara 6 0 22 0 0,00
    DAVIHLAB l'Havana 2410 5405 1.00
    Hosp. Artemisa l'Havana 2 0 2 0 0,00
    Hosp. Artemisa l'Havana 2410 20.390 5.00
    Hosp. Sandino Pineda del R ¡o 1 0 20 0 0,00
    Hosp. Sandino Pineda del R ¡o 1 660 20 640 3.00

    Com veuen Hospital de Artemisa i Sandino em surten repetits perquè tots dos tenen valor el 2009 i 2010. Com puc aconseguir que només em surti una vegada amb els valors sumats??

    • Eliseu diu:

      Pel que puc veure aquestes agrupant per tres camps (Group by A.idsucursal, Nomb_prov, A.idprovincia, S.nombre, A.ano) et agruparà tots els registres on "els tres" camps tinguin la mateixa dada, cosa que no succeeix en l'exemple que mostras donat que encara que l'hospital és el mateix hi ha un dels camps que conté una dada diferent.

      Salutacions

      Eliseo

Comentar