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 d'un champ avec la somme de plusieurs champs selon critères [10g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut Mise à jour d'un champ avec la somme de plusieurs champs selon critères
    Bonjour si quelqu'un peu m'aider sur le probleme suivant:

    je doit faire la mise à jour d'un champ SO avec la somme des champs SO,1,2,2E,3,3U,NE selon critere voici mon SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update dgp 
    set cl_so_liais_trav_piedroit_d = (select  cl_so_liais_trav_piedroit_d + cl_1_liais_trav_piedroit_d + cl_2_liais_trav_piedroit_d + cl_2E_liais_trav_piedroit_d + cl_3_liais_trav_piedroit_d + cl_3U_liais_trav_piedroit_d + cl_NE_liais_trav_piedroit_d from dgp where liais_trav_pdrt='ENC' and campagne=2015) 
    where liais_trav_pdrt='ENC' and campagne=2015;
    l'erreur est :
    Erreur SQL : ORA-01427: sous-interrogation ramenant un enregistrement de plus d'une ligne

    D'avance merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    S'il s'agit de mettre à jour une colonne à partir des valeurs d'autres colonnes de la ligne, il n'est pas nécessaire de passer par une sous-requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update  dgp 
        set cl_so_liais_trav_piedroit_d = cl_so_liais_trav_piedroit_d + cl_1_liais_trav_piedroit_d + cl_2_liais_trav_piedroit_d + cl_2E_liais_trav_piedroit_d + cl_3_liais_trav_piedroit_d + cl_3U_liais_trav_piedroit_d + cl_NE_liais_trav_piedroit_d 
    where   liais_trav_pdrt = 'ENC'
        and campagne        = 2015
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    La sous-requête SELECT est inutile, faîtes directement la somme dans l'update.
    Bon la colonne cl_so_liais_trav_piedroit_d n'a pas non plus une grande utilité.

  4. #4
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    merci al1_24, cependant, j'ai omis un point, le calcul se fait sur des champs contenant des valeurs nulles. j'ai essayé avec COALESCE(), mais le résultat est toujours null

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update  dgp 
        set CL_SO_LIAIS_TRAV_PIEDROIT_D = coalesce(NULL,CL_SO_LIAIS_TRAV_PIEDROIT_D)+ coalesce(NULL,cl_1_liais_trav_piedroit_d)+ coalesce(NULL,cl_2_liais_trav_piedroit_d)+ coalesce(NULL,cl_2E_liais_trav_piedroit_d)+ coalesce(NULL,cl_3_liais_trav_piedroit_d)+ coalesce(NULL,cl_3U_liais_trav_piedroit_d)+ coalesce(NULL,cl_NE_liais_trav_piedroit_d) 
    where   liais_trav_pdrt = 'ENC'
        and campagne        = 2015
    ;
    Merci skuatamad, cependant la colonne cl_so_liais_trav_piedroit_d peut contenir une valeur.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    La fonction COALESCE retourne la première valeur non nulle dans ses arguments. Ce n'est pas de cette manière qu'il faut l'utiliser.
    COALESCE(exp1, exp2, ..., exp3) est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CASE WHEN exp1 IS NOT NULL THEN exp1
       WHEN exp2 IS NOT NULL THEN exp2
       ...
       ELSE expN
    END
    Ta requête s'écrirait donc ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    update  dgp 
        set cl_so_liais_trav_piedroit_d = coalesce(cl_so_liais_trav_piedroit_d, 0) 
                + coalesce(cl_1_liais_trav_piedroit_d, 0) 
                + coalesce(cl_2_liais_trav_piedroit_d, 0) 
                + coalesce(cl_2E_liais_trav_piedroit_d, 0) 
                + coalesce(cl_3_liais_trav_piedroit_d, 0) 
                + coalesce(cl_3U_liais_trav_piedroit_d, 0) 
                + coalesce(cl_NE_liais_trav_piedroit_d, 0) 
    where   liais_trav_pdrt = 'ENC'
        and campagne        = 2015
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Merci al1_24, quelle rapidité de réponse, c'est exactement ce que j'attendais.



  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Tu as juste eu la chance que je passe par là au bon moment...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/03/2011, 14h28
  2. Mise à jour d'une BDD avec un champ accentué
    Par gyome314 dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 13/09/2007, 09h14
  3. [DOM4J] Mise à jour des docs xml avec dom4j
    Par kodo dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 06/04/2006, 21h48
  4. Mise à jour dans un formulaire avec condition
    Par Bourni dans le forum Access
    Réponses: 4
    Dernier message: 06/03/2006, 22h13
  5. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46

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