IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

group by avec case


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 17
    Points
    17
    Par défaut group by avec case
    Bonjour,

    je possède une table "table1" avec 4 colonnes :
    codemaille, habitats, surface, the_geom

    ---------------------------------------------
    codemaille | habitats| surface| the_geom|
    ---------------------------------------------
    1 | "1" | 8 | xxx
    1 | "2" | 1 | xxx
    2 | "3" | 8 | yyy
    2 | "13" | 1 | yyy
    2 | "3" | 8 | yyy
    3 | "14" | 1 | zzz
    3 | "3" | 7 | zzz
    3 | "4" | 1 | zzz
    ...
    je souhaite regrouper la table par le codemaille selon la condition suivante :
    prendre l'habitats et sa surface correspondante si l'habitats='13' ou '14' sinon je prends l'habitats correspond à la surface max (habitat majoritaire).

    pour faire j'ai fais cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SELECT distinct h.codemaille, max(h.habitats) as codehabitat
    FROM "Table1" as h, (SELECT t.codemaille as codemaille,
    case   when t.habitats='13' then t.surface
            when t.habitats='14' then t.surface
            else max(t.surface)
    END
    		   FROM "Table1" as t
    		   GROUP BY t.codemaille)AS hm 
    WHERE h.codemaille=hm.codemaille AND h.surface=hm.surface 
    GROUP BY h.codemaille
    ;
    évidement Postgres envoie l'erreur : « t.habitats » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat.

    Comment faire ???
    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Comment gérez-vous les égalités ?
    Qu'attendez-vous comme résultat de ce jeu de données-là par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     ------------------------------- 
     codemaille | habitats | surface 
     ------------------------------- 
              4 |      '1' |       5 
              4 |      '2' |       5 
              5 |      '3' |       3 
              5 |     '13' |       7 
              5 |     '14' |       7

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Normalement ce genre de situation est rare car les données viennent de l'intersection de 2 shape.

    Normalement dans la première requête , je veux récupérer ce genre de résultat :

    -------------------------------
    codemaille | surface
    -------------------------------
    4 | 5
    5 | 7

    et dans la deuxième requête je force par max(h.habitats) pour récupérer ce résultat :

    -------------------------------
    codemaille | habitats | surface
    -------------------------------
    4 | '2' | 5
    5 | '14' | 7

    J'avais essayé la requête sans forcer les deux habitats '13 et '14', elle renvoie des résultats satisfaisants.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je n'ai pas de postgreSQL sous la main, donc j'ai fait la requête sous Oracle, je vous laisse adapter la syntaxe si besoin.

    La fonction row_number() existe à partir de la version 8.4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    With SR as
    (  
    select codemaille, habitats, surface,
           row_number() over(partition by codemaille order by case when habitats in ('13', '14') then 1 else 0 end desc, surface desc, habitats desc) as rn
      from Table1
    )
      select codemaille, habitats, surface
        from SR
       where rn = 1
    order by codemaille asc;
     
    CODEMAILLE	HABITATS	SURFACE
    1		1		8
    2		13		1
    3		14		1
    4		2		5
    5		14		7

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci Waldar, ca marche très bien,
    elle est magique cette fonction row_number() je vais l'intégrer dans les autres requête.
    encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/05/2012, 09h48
  2. Problème avec case et group by
    Par queryz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/07/2010, 16h40
  3. [SQL Server 2000] SELECT avec CASE et GROUP BY
    Par strat0 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/03/2008, 18h45
  4. TreeView avec case à cocher
    Par da_latifa dans le forum Delphi
    Réponses: 9
    Dernier message: 07/10/2006, 01h01
  5. Pb avec case when !
    Par Brice Yao dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/08/2005, 08h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo