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

SQL Oracle Discussion :

mise à jour de champs dans une table à partir de calculs sur une autre table


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut mise à jour de champs dans une table à partir de calculs sur une autre table
    Re-bonjour à tous,

    J'ai de nouveau un petit pb d'écriture de requête SQL.

    Voici la structure de mes tables :

    maTable1 : annee, mois, id_lieu, id_num, Val
    avec des enregistrements du style
    2007, 01, A, aa, 15
    2007, 01, C, ret, 0
    2007, 10, C, ab, 0
    2007, 12, A, rfd, 0
    2007, 12, A, de, 1
    2007, 12, B, a, 5
    maTable2 : annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal

    J'aimerais renseigner maTable2 en sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     nbNumTot=count(id_num)
      sumValTot=sum(Val)
      nbNum=count(id_num) si mois=12
      sumVal=sum(Val) si mois=12
    afin d'obtenir le résultat suivant:
    2007, A, 3, 16, 2, 1
    2007, C, 2, 0, 0, 0
    2007, B, 1, 5, 1, 5
    J'ai commencé par écrire une requête qui me permet d'ajouter dans la table les informations nbNumTot et sumValTot, c'est à dire que j'obtiens le résultat suivant:
    2007, 1, 3, 16, 0, 0
    2007, 5, 2, 0, 0, 0
    2007, 3, 1, 5, 0, 0
    Je cherche maintenant à écrire la requête qui me permet de mettre à jour ces enregistrements pour les champs nbNum et sumVal.

    Je suppose qu'il doit être possible de faire le travail en 1 seule requête, mais je n'arrive pas à trouver la solution.

    Pouvez-vous m'aider ?
    Je suis sur Oracle 10g et je travaille à partir de sql developer.

    Merci à tous,
    MarieO

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    et ce serait trop demandé d'avoir la requête en question ?

    Merci de penser aux balises QUOTE et CODE

    As-tu regarder du coté des fonctions analytiques ?

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Pardon, j'ai effectivement oublié de mettre la requête concernée ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    insert into maTable2 (annee, id_lieu, nbNumTot, sumValTot)
    select annee, id_lieu, count(id_num), sum(Val)
    from maTable1
    group by annee, id_lieu
    MarieO

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    et pourquoi ça marche pas ça ?

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Cette requête fonctionne.
    Ce que je n'arrive pas à faire, c'est écrire la requête qui met à jour les données de la table maTable2 (pour les champs nbNum et sumVal) à partir de maTable1.

    Données dans maTable1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    maTable1 : annee, mois, id_lieu, id_num, Val
    2007, 01, A, aa, 15
    2007, 01, C, ret, 0
    2007, 10, C, ab, 0
    2007, 12, A, rfd, 0
    2007, 12, A, de, 1
    2007, 12, B, a, 5
     
    maTable2 : maTable2 : annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal
    vide pour le moment
    Après la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO maTable2 (annee, id_lieu, nbNumTot, sumValTot)
    SELECT annee, id_lieu, count(id_num), sum(Val)
    FROM maTable1
    GROUP BY annee, id_lieu;
    J'ai alors maTable2 qui contient les enregistrements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal
      2007, 1, 3, 16, 0, 0
      2007, 5, 2, 0, 0, 0
      2007, 3, 1, 5, 0, 0
    Je souhaite écrire la requête qui met à jour les données de maTable2 et me permet d'avoir comme résultat dans maTable2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal
    2007, A, 3, 16, 2, 1
    2007, C, 2, 0, 0, 0
    2007, B, 1, 5, 1, 5

  6. #6
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Oups,
    il faut lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal
      2007, A, 3, 16, 0, 0
      2007, C, 2, 0, 0, 0
      2007, B, 1, 5, 0, 0
    après la requête d'insertion des résultats...

    MarieO

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ajoute COUNT () OVER et SUM () OVER qui vont bien dans ta requête d'insertion... pour la 2° fois : regarde du coté des fonctions analytiques

  8. #8
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Citation Envoyé par marieo Voir le message
    Cette requête fonctionne.
    Ce que je n'arrive pas à faire, c'est écrire la requête qui met à jour les données de la table maTable2 (pour les champs nbNum et sumVal) à partir de maTable1.
    Tu parles de mise à jour (UPDATE) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE maTable2 
    SET (annee, id_lieu, nbNumTot, sumValTot)=
       (SELECT annee, id_lieu, count(id_num), sum(Val)
       FROM maTable1
       WHERE annee=maTable2.annee and   id_lieu=maTable2. id_lieu
       GROUP BY annee, id_lieu
       )
    WHERE--pour éviter de mettre des nulls dans les lignes de maTable2 n'ayant pas d'occurences dans maTable1
     (annee, id_lieu)IN 
       (SELECT annee, id_lieu
        FROM maTable1
        GROUP BY annee, id_lieu
       )

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    sauf qu'en faisant l'INSERT correctement il s'évite un UPDATE rendu inutile

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    J'ai bien tenté d'écrire la requête suivante mais j'ai un message d'erreur
    "ORA-00979 n'est pas une expression group by"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO maTable2 (annee, id_lieu, nbNumTot, sumValTot,nbNum,sumVal)
    SELECT annee, id_lieu, count(id_num), sum(Val), count(id_num) over(partition by annee,id_lieu order by mois range 12), sum(val) over (partition by annee,id_lieu order by mois range 12)
    FROM maTable1
    GROUP BY annee, id_lieu;
    La solution du UPDATE fonctionne mais c'est vrai qu'il faut alors faire 2 requêtes au lieu d'une seule.

    Quelqu'un aurait-il une solution à me proposer ?

    Merci à tous
    MarieO

  11. #11
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    et quelque chose comme cela ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO maTable2 (annee, id_lieu, nbNumTot, sumValTot,nbNum,sumVal)
    SELECT annee, id_lieu, count(id_num),sum(Val), nbNum,sumVal
    FROM (
         SELECT annee, id_lieu,  count(id_num) over(partition BY annee,id_lieu ORDER BY mois range 12) nbNum, 
         sum(val) over (partition BY annee,id_lieu ORDER BY mois range 12) sumVal
         FROM maTable1
         )
    GROUP BY annee, id_lieu,nbNum,sumVal;

  12. #12
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Ca ne fonctionne pas.
    j'ai le message d'erreur "missing keyword".

    MarieO

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

Discussions similaires

  1. Problème de mise à jour de champ dans l'en tête
    Par d.martin77 dans le forum VBA Word
    Réponses: 3
    Dernier message: 12/07/2014, 00h57
  2. Mise à jour de champs dans SQLite 3
    Par arobaskette dans le forum Android
    Réponses: 1
    Dernier message: 25/11/2013, 08h45
  3. Réponses: 1
    Dernier message: 01/08/2011, 20h49
  4. [AC-2003] Requête SQL pour Mise à jour de champs dans un formulaire suite à une saisie
    Par sunshine44 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/01/2010, 16h25
  5. Réponses: 2
    Dernier message: 09/01/2008, 10h56

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