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

JDBC Java Discussion :

fonction SUM dans une requête sql


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut fonction SUM dans une requête sql
    bonsoir,
    comment faire pour utiliser la fonction SUM(). est ce qu'il faut ajouter un package ou quoi ?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il n'y a pas besoin de "package" ou bibliothèque spéciaux pour utiliser une fonction SQL : il suffit qu'elle soit supportée par le SGBD (ce qui est le cas avec la plupart des SGBDR à priori) et de l'utiliser dans une requête, comme n'importe quel autre mot clef SQL (SELECT, WHERE, ou quoi), genre SELECT SUM(nom_colonne) FROM table ou SELECT id, SUM(valeur) AS total FROM table GROUP BY id, etc. Tout ce qui concerne l'usage de cette fonction en particulier concerne SQL, pas Java.

  3. #3
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut function SUM is undefined
    salut,
    J'utilise DB Browser for sqlite (3.10). Lorsque j'ai utilisé la fonction sum dans une requête Insert, j'ai eu une erreur sur SUM (The method SUM(Object) is undefined for the type new ActionListener(){}).
    PS: merci pour votre réponse

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Montre le code que tu écris. Et la stacktrace complète de l'exception.

  5. #5
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Voici une partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			  statement.executeUpdate("INSERT INTO Versement ( Nom , Prenom, Date ,Prix_du_logement, Somme_versee , Nom_du_projet, Versement_total) VALUES('" + nom.getText() +"','" +prenom.getText() +"','"  +date.getText() + "'," +  "(SELECT Prix_du_logement FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "')," + verse.getText()+ "," + " (SELECT  Nom_du_projet  FROM Client WHERE Nom='" + nom.getText()+ "' AND Prenom='" +prenom.getText() + "'),"+ SUM(Versement_total)+ ")");
     
    			  JOptionPane.showMessageDialog(null, "Element ajouté");

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    Ce n'est pas un problème Java.
    Ta requête SQL ne peut pas fonctionner comme cela.

    1) on ne peut pas appeler une sous-requête (avec SELECT) quand on utilise VALUES ( ...
    c'est beaucoup plus simple : on utilise SELECT à la place de VALUES quand on fait appel à des données venant d'une autre table

    2) tu utilises SUM(Versement_total) qui est un agrégat sans préciser de quelle table il vient.

    Bref, en SQL tout est faux.

    De ce que je comprends de ta requête, tu veux insérer dans la table Versement
    des informations issues de la table Client en ajoutant la date et SUM(Versement_total)

    Dans un premier temps, on va mettre de côté SUM(Versement_total) car je ne sais pas pourquoi tu veux l'insérer ni de quelle table cela provient.

    La requête correcte est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	"INSERT INTO Versement 	( Nom , Prenom, Date ,Prix_du_logement, Somme_versee , Nom_du_projet) 	
    	SELECT Nom, Prenom,'" +date.getText() + "', Prix_du_logement, Nom_du_projet 
    	FROM Client 
    	WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "'"
    Dans un second temps, on verra comment ajouter SUM(Versement_total)

  7. #7
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    bonsoir,
    ma requête fonctionne le plus normalement du monde en utilisant SELECT dans INSERT , le probléme se pose dans SUM (nom_du_colomne de la table) .
    je ne sais pas comment y résoudre .

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bensh Voir le message
    ma requête fonctionne le plus normalement du monde en utilisant SELECT dans INSERT ,
    En fait, ce n'est pas standard mais certain SGBD peuvent en effet le supporter.

    En revanche, le problème dans ton code au sujet de sum, c'est que cela doit faire partie de la requête. SUM c'est une fonction SQL, pas Java. Il faut que tu l’intègres dans la string constituant la requête (pour éviter ce genre de truc, on évite de faire des concaténations, on utilise le placeholder ? et on injecte les valeurs dans le PreparedStatement).

    Tu as écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "' AND Prenom='" +prenom.getText() + "'),"+ SUM(Versement_total)+ ")");
    Regarde bien où se trouvent les guillemets.

    Il faudrait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "' AND Prenom='" +prenom.getText() + "'),  SUM(Versement_total) )");
    Là, SUM est dans la requête. En revanche, je ne pense pas que ça fonctionnera non plus, parce que SUM c'est un agrégat sur une sélection. Alors que dans ta requête il correspondrait à la sum de ce qu'on est en train d'insérer et qui n'existe pas encore. Je ne pratique pas assez le SQL pour connaître la bonne solution, mais à mon avis, ça ne sera pas possible en une requête, ou alors il faudrait ajouter le montant du versement actuel avec le total des versements existant, quelque chose comme verse.getText()+" + SELECT SUM(Versement_total) FROM ...., à supposer que la syntaxe soit supportée et en utilisant des alias pour éviter la confusion avec l'insertion en cours.

  9. #9
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Je pense que les guillemets ont été mal placés .
    Merci bien

  10. #10
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    SUM(Versement_total) indique que l'on fait un total de plusieurs enregistrements.
    Si Versement_total vient d'un seul enregistrement de la table Client (à savoir la fiche client), alors il est parfaitement inutile de faire un SUM.

  11. #11
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Non je veux faire la somme de plusieurs enregistrements

  12. #12
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut No shuch column Somme_versee
    En ajoutant SUM(Somme_versee) j'ai cette erreur : No shuch column Somme_versee alors que la colonne existe dans ma table.



    statement.executeUpdate("INSERT INTO Versement ( Nom , Prenom, Date , Somme_versee,Prix_du_logement, Nom_du_projet, Versement_total) VALUES('" + nom.getText() +"','" +prenom.getText() +"','" +date.getText() + "'," + verse.getText() + ", " + "(SELECT Prix_du_logement FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "')," + " (SELECT Nom_du_projet FROM Client WHERE Nom='" + nom.getText()+ "' AND Prenom='" +prenom.getText() + "')," + "(SUM(Somme_versee))"+ ")");

  13. #13
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    Citation Envoyé par bensh Voir le message
    No such column Somme_versee alors que la colonne existe dans ma table.
    oui mais dans quelle table ?

    Il y a bien une colonne Somme_versee dans la table Versement
    Mais si tu veux prendre cette colonne , cela veut dire que tu vas additionner toutes les sommes déjà versées dans le nouvel enregistrement ...

  14. #14
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Mais si tu veux prendre cette colonne , cela veut dire que tu vas additionner toutes les sommes déjà versées dans le nouvel enregistrement ...
    Jj'ai l'impression que c'est ça le but... une dénormalisation du prix total (d'ailleurs on dirait que (presque) tout est dénormalisé )... et du coup, ça serait logique de mettre à jour les enregistrements déjà existant, pour qu'ils contiennent tous le prix total et donc deux faire tout ça en deux requêtes : un insert pour le nouveau versement, un update pour mettre à jour la sum des versements dans le champ "total".

  15. #15
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    De ce que je comprends et après avoir regardé un peu la doc Sql lite, on doit pouvoir simplifier un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            String sql;
            sql = "INSERT INTO Versement ( Nom , Prenom, Date , Somme_versee, Prix_du_logement, Nom_du_projet, Versement_total) "
                    + "SELECT  Nom, Prenom,'" +date.getText() + "'," + verse.getText() + ", Prix_du_logement, Nom_du_projet, "
                    + "(SELECT  SUM(Somme_versee) FROM Versement WHERE Nom='"+ nom.getText() + "' AND Prenom='"+ prenom.getText() +"') "
                    + "FROM Client WHERE   Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "'";
            statement.executeUpdate(sql);

  16. #16
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    J'ai fait ça code hier et au niveau du versement_total ça m'a donné "Versement_total m sauf qu'il n'a pas additionner celle que je venais d’insérer dans " verse.getText()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    statement.executeUpdate("INSERT INTO Versement ( Nom , Prenom, Date , Somme_versee,Prix_du_logement, Nom_du_projet, Versement_total, Versement_restant) VALUES('" + nom.getText() +"','" +prenom.getText() +"','"  +date.getText() + "'," +  verse.getText() + ", " + "(SELECT Prix_du_logement FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "')," + " (SELECT  Nom_du_projet  FROM Client WHERE Nom='" + nom.getText()+ "' AND Prenom='" +prenom.getText() + "'), ((SELECT SUM(Somme_versee) FROM Versement WHERE Nom='"+ nom.getText() + "' AND Prenom='"+ prenom.getText() +"')," + "(SELECT (Prix_du_logement- Versement_total) FROM Versement WHERE Prenom='" +prenom.getText()+ "' AND Nom='" +nom.getText() + "')"+" )");

  17. #17
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    C'est normal, tu ne nous a pas dit que c'était ce que tu voulais ...

    Cela pourrait marcher avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            String sql;
            sql = "INSERT INTO Versement ( Nom , Prenom, Date , Somme_versee, Prix_du_logement, Nom_du_projet, Versement_total) "
                    + "SELECT  Nom, Prenom,'" +date.getText() + "'," + verse.getText() + ", Prix_du_logement, Nom_du_projet, "
                    + "(SELECT  SUM(Somme_versee) +" + verse.getText() + " FROM Versement WHERE Nom='"+ nom.getText() + "' AND Prenom='"+ prenom.getText() +"') "
                    + "FROM Client WHERE   Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "'";
            statement.executeUpdate(sql);

  18. #18
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    ça marche mnt merci beaucoup

  19. #19
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    Oui mais ce n'est pas très fiable comme code.
    Dès que tu auras un nom avec une apostrophe, un chiffre à virgule ou une date pas très bien formatée alors les problèmes vont recommencer.

    Il faut que tu regardes du côté des PreparedStatement pour stabiliser un peu tout cela ...

  20. #20
    Membre du Club
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Effictivement, j'ai essayé d'insérer des noms avec des des apostrophes et ça ne marche pas.
    merci pour la remarque

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/05/2016, 15h10
  2. [PostgreSQL] Utiliser une fonction PHP dans une requête SQL
    Par Toiine dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/11/2014, 12h16
  3. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37
  4. Réponses: 3
    Dernier message: 04/01/2009, 21h21
  5. [ACCESS2002][fonction sum dans une requête]
    Par louroulou dans le forum Access
    Réponses: 1
    Dernier message: 14/06/2006, 09h26

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