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

Langage SQL Discussion :

Problème avec Group By


Sujet :

Langage SQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut Problème avec Group By
    Bonjour,

    Voici ma 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
    15
    16
    17
    18
    19
    20
     
     WITH tmp AS(
     	  SELECT P.NOM,P.PRENOM,P.DTENAI,P.TEL,S.NUMPAT,S.HEURE,S.NOMBOSS,S.SUIVI,x.numobj,
     	  DENSE_RANK () OVER (PARTITION BY P.numpat ORDER BY x.NUMOBJ DESC) AS rnk 
     	  FROM  SUIVI S 
     	  		right OUTER JOIN PATIENTS P ON p.numpat =s.numpat 
     				  INNER JOIN OBJETS x on (x.numpat = s.numpat) 
     	  WHERE S.NUMPAT <> 0 
     	  AND S.DTEDEB = TO_DATE('03/22/2013','MM/DD/YYYY') 
     	  AND S.SUIVI NOT IN ('CNG') 
     	  AND (S.NUMSRV = 0 OR S.NUMSRV = 26) 
     	  AND (S.NUMSITE = 1 OR S.NUMSITE IS NULL) 
     	  AND P.NUMPAT = S.NUMPAT 
     	  AND S.NUMDESCRIPTION<>0 
     	  AND NOMSALLE IS NULL
     	  AND x.DEFFEN=10082
     	  AND x.COMPTERENDU NOT LIKE '%«DTEACC»__/__/__%' 
     	  AND S.SUIVI not IN  ('---','LEC','VAL','LTR','ATP'))
        SELECT * FROM tmp 
        WHERE rnk = 1
    Mon problème est que j'ai parfois des doublons à cause de la table SUIVI.

    J'avais pensé à faire un Group By sur le numobj mais ça ne fonctionne pas:

    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
    18
    19
    20
     
     WITH tmp AS(
     	  SELECT P.NOM,P.PRENOM,P.DTENAI,P.TEL,S.NUMPAT,S.HEURE,S.NOMBOSS,S.SUIVI,x.numobj,
     	  DENSE_RANK () OVER (PARTITION BY P.numpat ORDER BY x.NUMOBJ DESC) AS rnk 
     	  FROM  SUIVI S 
     	  		right OUTER JOIN PATIENTS P ON p.numpat =s.numpat 
     				  INNER JOIN OBJETS x on (x.numpat = s.numpat) 
     	  WHERE S.NUMPAT <> 0 
     	  AND S.DTEDEB = TO_DATE('03/22/2013','MM/DD/YYYY') 
     	  AND S.SUIVI NOT IN ('CNG') 
     	  AND (S.NUMSRV = 0 OR S.NUMSRV = 26) 
     	  AND (S.NUMSITE = 1 OR S.NUMSITE IS NULL) 
     	  AND P.NUMPAT = S.NUMPAT 
     	  AND S.NUMDESCRIPTION<>0 
     	  AND NOMSALLE IS NULL
     	  AND x.DEFFEN=10082
     	  AND x.COMPTERENDU NOT LIKE '%«DTEACC»__/__/__%' 
     	  AND S.SUIVI not IN  ('---','LEC','VAL','LTR','ATP'))group by x.numobj
        SELECT * FROM tmp 
        WHERE rnk = 1
    ORA-00928: mot-clé SELECT absent.

    Comment faire pour ne plus avoir de doublons ?

    D'avance merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    S'il s'agit juste d'un problème de doublons de ligne dans le résultat, pourquoi ns pas utiliser DISTINCT ?

    Tatayo.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Parce que le champ s.heure est différent dans mes doublons.

    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
    18
    19
    20
     
     WITH tmp AS(
     	  SELECT DISTINCT(P.NOM,P.PRENOM,P.DTENAI,P.TEL,S.NUMPAT,S.NOMBOSS,S.SUIVI,x.numobj,
     	  DENSE_RANK () OVER (PARTITION BY P.numpat ORDER BY x.NUMOBJ DESC) AS rnk) 
     	  FROM  SUIVI S 
     	  		right OUTER JOIN PATIENTS P ON p.numpat =s.numpat 
     				  INNER JOIN OBJETS x on (x.numpat = s.numpat) 
     	  WHERE S.NUMPAT <> 0 
     	  AND S.DTEDEB = TO_DATE('03/22/2013','MM/DD/YYYY') 
     	  AND S.SUIVI NOT IN ('CNG') 
     	  AND (S.NUMSRV = 0 OR S.NUMSRV = 26) 
     	  AND (S.NUMSITE = 1 OR S.NUMSITE IS NULL) 
     	  AND P.NUMPAT = S.NUMPAT 
     	  AND S.NUMDESCRIPTION<>0 
     	  AND NOMSALLE IS NULL
     	  AND x.DEFFEN=10082
     	  AND x.COMPTERENDU NOT LIKE '%«DTEACC»__/__/__%' 
     	  AND S.SUIVI not IN  ('---','LEC','VAL','LTR','ATP'))
        SELECT * FROM tmp 
        WHERE rnk = 1
    Et si j'utilise un distinct j'ai l'erreur: ORA-00907: parenthèse de droite absente

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Et en mettant le distinct dans le dernier FROM ?
    Code SQL : 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
    18
    19
    20
    21
     
     
     WITH tmp AS(
     	  SELECT P.NOM,P.PRENOM,P.DTENAI,P.TEL,S.NUMPAT,S.NOMBOSS,S.SUIVI,x.numobj,
     	  DENSE_RANK () OVER (PARTITION BY P.numpat ORDER BY x.NUMOBJ DESC) AS rnk 
     	  FROM  SUIVI S 
     	  		RIGHT OUTER JOIN PATIENTS P ON p.numpat =s.numpat 
     				  INNER JOIN OBJETS x ON (x.numpat = s.numpat) 
     	  WHERE S.NUMPAT <> 0 
     	  AND S.DTEDEB = TO_DATE('03/22/2013','MM/DD/YYYY') 
     	  AND S.SUIVI NOT IN ('CNG') 
     	  AND (S.NUMSRV = 0 OR S.NUMSRV = 26) 
     	  AND (S.NUMSITE = 1 OR S.NUMSITE IS NULL) 
     	  AND P.NUMPAT = S.NUMPAT 
     	  AND S.NUMDESCRIPTION<>0 
     	  AND NOMSALLE IS NULL
     	  AND x.DEFFEN=10082
     	  AND x.COMPTERENDU NOT LIKE '%«DTEACC»__/__/__%' 
     	  AND S.SUIVI NOT IN  ('---','LEC','VAL','LTR','ATP'))
        SELECT distinct * FROM tmp 
        WHERE rnk = 1

    Tatayo.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Ok vais faire comme ça

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    rank et dense_rank permette de gérer les exéco. Donc le critère de tri n'est pas suffisant.
    En rajoutant s.heure dans le tri est-ce mieux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DENSE_RANK () OVER (PARTITION BY P.numpat ORDER BY x.NUMOBJ DESC, S.HEURE desc)
    Par contre row_number ne gère pas les exécos, mais si 2 lignes sont canditates, la requête ne sera pas consistante dans le temps (en fonction des exécutions l'une ou l'autre ligne exéco pourra être renvoyée).
    C'est pourquoi il est préférable/nécessaire de bien sécifier la clause order by lors de l'utilisation des fonctions analytiques.

    Regarde ROW_NUMBER, RANK, DENSE_RANK et COUNT

    Pour info DISTINCT n'est pas une fonction et s'utilise sans parenthèses car il s'applique sur l'ensemble de la ligne.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    ok merci skuatamad

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

Discussions similaires

  1. problème avec GROUP BY
    Par benjisan dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/06/2007, 11h48
  2. [XI] problème avec groupe sur un champ trié par origine ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 11/04/2007, 15h31
  3. Problème avec GROUP BY
    Par Korskarn dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/03/2006, 14h35
  4. Problème avec group by...
    Par gdido dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/07/2005, 09h34
  5. [débutant] problème avec Group by
    Par Amenofis dans le forum Débuter
    Réponses: 5
    Dernier message: 25/05/2005, 09h57

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