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 :

group by et element manquant


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2
    Par défaut group by et element manquant
    Bonjour
    Je travaille sous Oracle 8i.
    Je désire regrouper des valeurs(value) de différent appareil de mesure(id) par dates, mais il manque des données à certaines dates.
    Un extrait de ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ddat       id	  value	
    01.01.04    1	      5	
    01.01.04	 2	      6	
    01.01.04	 3	      7	
    02.01.04	 1	      8	
    02.01.04	 2	      9	
    02.01.04	 3 	    10	
    03.01.04	 1	     11	
    03.01.04	 3	     13
    Je désire obtenir ce résultat, l'emplacement vide peut être remplacé par n'importe quoi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DDATE	               1	         2	          3
    --------      ----------   ----------    ----------
    01.01.04	            5	         6	          7
    02.01.04	            8	         9	         10
    03.01.04	           11		                   13
    J'ai essayé avec la requète suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select i.ddate, i.value "1", j.value "2", k.value "3" 
    from mesure i, mesure j, mesure k where
    i.ddate = j.ddate and
    i.ddate = k.ddate and
    i.id = '1' and
    j.id =  '2' and
    k.id =  '3' 
    group by i.ddate, i.value, j.value, k.value;
    Mais le résultat est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DDATE              1            2            3
    --------  ----------   ----------   ----------
    01.01.04           5            6            7
    02.01.04           8            9           10
    Puis-je arriver à mes fins avec une seule commande SQL.

    Merci d'avance
    Eric

  2. #2
    Membre expérimenté
    Avatar de Superstivix
    Inscrit en
    Décembre 2003
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 250
    Par défaut
    salut,

    je comprends pas très bien l'interêt de l'utilisation de la clause GROUP BY!

    As-tu essayé de mettre
    à la place?

    Cordialement
    Superstivix

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Par défaut
    En principe SQL n'est pas fait pour "Formater" les infos en sortie !!!

    Mais tu peux essayer ca :
    - Converti les LEFT JOIN en (+) si ta version d'Oracle ne les acceptes 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
    21
    22
    23
    24
     
    select 
              A.ddate, B.value "1", C.value "2", D.value "3" 
    from 
         ( select
                     distinct ddate
            from
                     mesure
          ) as A 
        Left Join
            mesure B
         On
             B.ddate = A.ddate and
             B.id       = 1
        Left Join
            mesure C
         On
             C.ddate = A.ddate and
             C.id       = 2
        Left Join
            mesure D
         On
             D.ddate = A.ddate and
             D.id       = 3

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Voila ce que j'ai fait :

    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
     select LEAST(i.ddate,j.ddate,k.ddate), max(i.value) "1", max(j.value) "2", max(k.value) "3"
     from (SELECT * FROM mesure WHERE id = '1'
             UNION
           SELECT DISTINCT ddate, 2, NULL from mesure
          ) i,
          (SELECT * FROM mesure WHERE id = '2'
             UNION
           SELECT DISTINCT ddate, 2, NULL from mesure
          ) j,
          (SELECT * FROM mesure WHERE id = '3'
             UNION
           SELECT DISTINCT ddate, 2, NULL from mesure
          ) k
     where
     i.ddate = j.ddate and
     i.ddate = k.ddate
     group by i.ddate,j.ddate,k.ddate
    j'ajoute une ligne vierge pour chaque date et chaque id mais je ne sélectionne que le max(value) de chaque id. Par ailleurs, j'affiche la plus grande date trouvée puisqu'on ne sait pas a priori laquelle manque

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Par défaut
    Oups, en terme d'usine à gaz je suis battu
    Bon d'accord je

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    LOL

    il faut admettre que ce type de requête est forcément usinamazoutesque

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2
    Par défaut
    Merci tout fonctionne à merveille.

    Suite à quelques petits problèmes j'ai modifié la requète comme suit:

    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
     
     select LEAST(iddate,jddate,kddate), max(ival) "1", max(jval) "2", max(kval) "3" 
     from (SELECT to_date(ddate)as iddate, to_number(id)as iid, to_number(value)as ival FROM mesure WHERE id = '1' 
             UNION 
           SELECT DISTINCT to_date(ddate), to_number(2), to_number(NULL) from mesure 
          ) i, 
          (SELECT to_date(ddate)as jddate, to_number(id)as jid, to_number(value)as jval FROM mesure WHERE id = '2' 
             UNION 
           SELECT DISTINCT to_date(ddate), to_number(2), to_number(NULL) from mesure 
          ) j, 
          (SELECT to_date(ddate)as kddate, to_number(id)as kid, to_number(value)as kval FROM mesure WHERE id = '3' 
             UNION 
           SELECT DISTINCT to_date(ddate), to_number(2), to_number(NULL) from mesure 
          ) k 
     where 
     iddate = jddate and 
     iddate = kddate 
     group by iddate,jddate,kddate;
    Vous ête des grands gourous, chapeau bas.
    Pour vous remercier j'ai bougé la webcam de notre site pour vous montrer la neige qui nous a été donnée cette nuit.

    http://www.grande-dixence.ch/fr/infos_touristiques/webcam.php

    Merci encore
    Eric

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

Discussions similaires

  1. [AC-2003] Element manquant dans chemin d'accès
    Par ortiz dans le forum VBA Access
    Réponses: 7
    Dernier message: 26/03/2015, 08h57
  2. [AC-2010] Problème import XML dans Access: Elements manquants.
    Par Djey13250 dans le forum Access
    Réponses: 8
    Dernier message: 01/08/2014, 16h00
  3. Réponses: 8
    Dernier message: 11/04/2007, 23h06

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