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

PostgreSQL Discussion :

Elaboration d'une requête


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Points : 49
    Points
    49
    Par défaut Elaboration d'une requête
    Bonjour,

    je vous expose l'environnement:

    j'ai dans une table 3 champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    id
    Contrat:
    statutContrat:
    le champ "statutContrat" peut prendre 4 valeurs qui vont de 1 à 4

    je voudrais connaitre les numéros de contrats dont le statut est uniquement à 1, car le même contrat peut prendre jusqu’à 3 valeurs

    je vous remercie pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    il faudrai passer par un group by :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select Contrat
    from ma_table
    group by Contrat
    having sum(case when statutContrat = 1 then 1 else 2 end) = 1

  3. #3
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Points : 49
    Points
    49
    Par défaut
    Merci pour vôtre réponse,

    cela fonctionne bien. Il y a un petit hic,

    je pensais qu'en vous donnant que les 3 champs id,contrat,statutContrat cela allait suffir.

    ma table est composé d'un 4eme champ qui est la date à laquelle le contrat est passé a la valeur 1 ou 2 ou 3 ou 4.

    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    id = 1  | contrat = 3545 | statut = 1 | datesaisie = 01/01/2012
    id = 2  | contrat = 3545 | statut = 2 | datesaisie = 15/01/2012
    id = 3  | contrat = 1012 | statut = 1 | datesaisie = 28/10/2011
    id = 4  | contrat = 2244 | statut = 1 | datesaisie = 02/02/2012
    id = 5  | contrat = 2244 | statut = 2 | datesaisie = 14/03/2012
    id = 6  | contrat = 2244 | statut = 4 | datesaisie = 26/03/2012
    id = 7  | contrat = 6950 | statut = 1 | datesaisie = 02/04/2012
    id = 8  | contrat = 6950 | statut = 2 | datesaisie = 09/04/2012
    id = 9  | contrat = 7593 | statut = 1 | datesaisie = 02/01/2012
    id = 10 | contrat = 6512 | statut = 1 | datesaisie = 05/01/2012
    dés que j'execute la requête que vous m'avez fourni avec juste le contrat ==> Ok : j'ai bien le contrat 6512/7593/1012 qui remontent.

    j'ai voulu rajouter le champ statut + la date (dans le Select) ==> je n'ai plus le même nombre d'enregistrements, l'orde de grandeur est un peu plus du double.

    les champs "Contrat" et "statut" sont des Fk.(si ça peut aider).
    l'idéal serait que j'arrive à ramener le champ :"numcontrat" de ma table "ContratOP".

    merci d'avance pour les éclaircissement

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par jp_____ Voir le message
    j'ai voulu rajouter le champ statut + la date (dans le Select) ==> je n'ai plus le même nombre d'enregistrements, l'orde de grandeur est un peu plus du double.
    Il faudrait mettre la nouvelle requête parce que tel qu'exprimé, ce n'est pas possible: on ne peut pas ajouter des champs non aggrégés derrière le SELECT alors qu'il y a un GROUP BY Contrat.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH T AS (
    SELECT *, sum(case when statutContrat = 1 then 1 else 2 end) OVER (PARTITION BY Contrat) AS N
    FROM   ma_table)
    SELECT *
    FROM   T
    WHERE  N = 1
    Et pour un cours sur SQL, mon bouquin comme mon site web, peuvent vous y aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    je vous remercie pour vôtre réponse mais je ne comprends pas comment faut l'écrire / exploiter

    un copier coller de votre solution dans PgAdmin =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERREUR:  erreur de syntaxe sur ou près de « WITH T »
    LINE 1: WITH T AS (
    La requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WITH T AS (
    SELECT *, sum(case when statutContrat = 1 then 1 else 2 end) OVER (PARTITION BY Contrat) AS N
    FROM   Contrat_Statut)
    SELECT *
    FROM   T
    WHERE  N = 1
    pouvez vous m'éclairer ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    quelle est votre version de postgresql ?

  8. #8
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Points : 49
    Points
    49
    Par défaut
    La version en DEV ==> 8.3

    La version en PROD ==> 9.1

    je viens de tester sur la prod => la requête s'execute sans probléme (je n'ai pas regarder si les resultats étaient bon).

    en revanche on m'a fourni cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * 
    FROM Contrat_Statut
    WHERE Contrat
    NOT IN (SELECT Contrat from Contrat_Statut
    WHERE statutContrat  != 1)
    Qu'en pensez-vous ?

    ça à l'air de me sortir des résultats attendus, j'en suis encore à faire des vérifications.

    j'avoue ne pas trop comprendre cette solution et celle presentée par SQLpro.
    mes "connaissances" SQL sont de l'ordre du select * from table ....

    en tout cas merci pour vos réponses

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Elle marche aussi, mais vous faites 2 scans de table au lieu de n'en faire qu'un seul.


    Donc niveau perf elle sera moins bien.

  10. #10
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    je vous remercie pour vos réponses ça m'a bien aidé.

    sujet clos

  11. #11
    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
    Vu qu'il n'y a qu'un seul statut qui vous intéresse, on peut se passer de la sous-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
    14
      SELECT MAX(Id)         as Id
           , Contrat
           , MAX(statut)     as statut
           , MAX(datesaisie) as datesaisie
        FROM Contrat_Statut
    GROUP BY Contrat
      HAVING MAX(statut) = 1
    ORDER BY Id;
     
    Id          Contrat     statut      datesaisie
    ----------- ----------- ----------- -----------------------
    3           1012        1           2011-10-28 00:00:00.000
    9           7593        1           2012-01-02 00:00:00.000
    10          6512        1           2012-01-05 00:00:00.000
    Notez que ça ne fonctionne que dans ce cas-là.

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

Discussions similaires

  1. [MySQL] Elaboration d'une requête SELECT complexe
    Par nicoxweb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/10/2007, 22h46
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17
  4. Proposer le resultat d'une requête en téléchargement
    Par Lux interior dans le forum XMLRAD
    Réponses: 5
    Dernier message: 17/02/2003, 15h44
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

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