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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    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 : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    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 confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    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 Expert
    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
    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 999
    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 999
    Billets dans le blog
    6
    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 confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    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 ?

+ 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