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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    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
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    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 averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    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
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    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 averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    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