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 :

requete de SUM


Sujet :

Langage SQL

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut requete de SUM
    Bonjour,
    Voici un exemple d'une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    --------------------------------------------------
    | id |     nom   | prd1  | prd2 | prd3  | prd4   |
    --------------------------------------------------
    |  1 | societe1  |  null |  3   |   2   |  null  |
    |  2 | societe2  |  4    | null |   1   |  null  |
    |  3 | societe3  |  null |  1   | null  |   1    |
    |  4 | societe4  |  null |  3   | null  |   null |
    Avec ca, on me demande de lister le nombre de société qui ont x produits

    faudrait en sortir :
    il y a 3 sociétés qui ont 4 produits
    5 qui ont 6 produits
    6 qui ont 7 produits...

    Bref, j'ai essayé avec des SUM() mais c'est plus de mon niveau

    Quelqu'un peu m'aider ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Donne nous la requête que tu as commencé à écrire ?
    Nous pourrons t'aider à la mettre au point.

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut
    ouh laa... pour me donner la honte ?
    Bon... alors ouvrez vos yeux
    SELECT SUM(prod1+prod2+prod3+prod4=) FROM table

    Me donne qu'une ligne "null"

    Maintenant je me demande si je ferai pas un petit bout de code PHP pour traiter la somme de chaque ligne puis faire une sorte de tri...

    Et le problème, me semble-t-il, vient aussi des valeur null, il faudrait aussi que je les remplace tous par 0...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Le marqueur null se propage sur les opérations telles que la somme, une solution serait donc d'utiliser COALESCE qui transforme null en autre chose.
    Ce qui donne sur ta requete initiale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(Coalesce(prod1,0)+coalesce(prod2,0)+coalesce(prod3)+coalesce(prod4)) FROM table
    En revanche je ne vois pas pourquoi tu utilise le mot clé sum vu la question qui t'es posée.

    A+
    Soazig

  5. #5
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut
    Ah oui, ca commence à donner quelque chose
    Mais je me demande vraiment si c'est possible de faire ça en SQL...
    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
    --------------------------------------------------
    | id |     nom   | prd1  | prd2 | prd3  | prd4   |
    --------------------------------------------------
    |  1 | societe1  |  NULL |  3   |   2   |  NULL  |
    |  2 | societe2  |  4    | NULL |   1   |  NULL  |
    |  3 | societe3  |  NULL |  1   | NULL  |   1    |
    |  4 | societe4  |  NULL |  3   | NULL  |   NULL |
    |  5 | societe3  |  NULL |  1   | NULL  |   1    |
    |  6 | societe2  |  1    | NULL |   5   |  NULL  |
     
    | nbrsociete    | totalprd  |
    -----------------------------
    |  2            |  2        | 
    |  1            |  3        | 
    |  2            |  5        |
    |  1            |  6        |
    Ca me parait de la haute voltige là...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    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 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Bonjour,
    Avec une sous-requête ça doit être jouable:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select id,SUM(Coalesce(prod1,0)+coalesce(prod2,0)+coalesce(prod3)+coalesce(prod4) as total from table
    Cette requête renvoie le total de produit par société.
    Ensuite:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select total,count(*) from
    (
    select id,SUM(Coalesce(prod1,0)+coalesce(prod2,0)+coalesce(prod3)+coalesce(prod4) as total from table
    ) as regroupement
    group by total
    Ainsi, pour chaque "total" d'article, tu as le nombre de sociétés correspondantes.

    Tatayo.

  7. #7
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut
    Ouaip à mon avis ca doit être tout bon.. Mais MySQL semble pas assez aimer Mais je pense avoir toutes les balles !

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    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 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Oups, je viens de voir une erreur dans ma deuxième requête:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT total,count(*) FROM
    (
    SELECT id,Coalesce(prod1,0)+coalesce(prod2,0)+coalesce(prod3)+coalesce(prod4) AS total FROM TABLE
    ) AS regroupement
    GROUP BY total

    Tatayo.

  9. #9
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut
    J'y vais par étape sur MySQL
    déjà sur ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select id,SUM(Coalesce(prod1,0)+coalesce(prod2,0)+coalesce(prod3)+coalesce(prod4)) 
    as total from table
    il n'aime pas :
    #1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

    en enlevant "id," ca passe !?

  10. #10
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Oups, je viens de voir une erreur dans ma deuxième requête:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT total,count(*) FROM
    (
    SELECT id,Coalesce(prod1,0)+coalesce(prod2,0)+coalesce(prod3)+coalesce(prod4) AS total FROM TABLE
    ) AS regroupement
    GROUP BY total

    Tatayo.
    ben mince, ca pas point :
    #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT id , Coalesce( prod1, 0 ) + coalesce( prod2, 0 ) + coales

  11. #11
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut
    Citation Envoyé par toss.net Voir le message
    J'y vais par étape sur MySQL
    déjà sur ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select id,SUM(Coalesce(prod1,0)+coalesce(prod2,0)+coalesce(prod3)+coalesce(prod4)) 
    as total from table
    il n'aime pas :
    #1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

    en enlevant "id," ca passe !?
    Pour ca bizzarement j'ai ajouté AS ID pour que cela passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select id as id,coalesce(prod1,0)+coalesce(prod2,0)+coalesce(prod3)+coalesce(prod4) 
    as total from table

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,

    Pour ton post de 9h14 dans la requete de tatayo il n'y avait pas de SUM.

    Pour ton autre problème mea culpa.
    coalesce(prod3) n'est pas correct il faut coalesce(prod3,0) comme pour les autres, idem pour prod4.

    a+
    Soazig

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 879
    Points : 53 057
    Points
    53 057
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par toss.net Voir le message
    Ah oui, ca commence à donner quelque chose
    Mais je me demande vraiment si c'est possible de faire ça en SQL...
    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
    --------------------------------------------------
    | id |     nom   | prd1  | prd2 | prd3  | prd4   |
    --------------------------------------------------
    |  1 | societe1  |  NULL |  3   |   2   |  NULL  |
    |  2 | societe2  |  4    | NULL |   1   |  NULL  |
    |  3 | societe3  |  NULL |  1   | NULL  |   1    |
    |  4 | societe4  |  NULL |  3   | NULL  |   NULL |
    |  5 | societe3  |  NULL |  1   | NULL  |   1    |
    |  6 | societe2  |  1    | NULL |   5   |  NULL  |
     
    | nbrsociete    | totalprd  |
    -----------------------------
    |  2            |  2        | 
    |  1            |  3        | 
    |  2            |  5        |
    |  1            |  6        |
    Ca me parait de la haute voltige là...
    Votre postulat de départ est faux. Vous n'arriverez jamais à rien. En effet, quelle est la règle ? Vous avez deux fois la société 2 et 3 dans votre table.

    Les résultats ne peuvent donc pas être ceux montrés....

    En sus votre modèle est non relationnel. C'est pour cela que votre jeu d'essasi est faux et que les requêtes sont inexprimables.

    Voici un modèle correcte qui respecte les formes normales :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- la table des sociétés :
    CREATE TABLE T_SOCIETE
    (STE_ID        INT NOT NULL PRIMARY KEY,
     STE_NOM       VARCHAR(32));
     
    INSERT INTO T_SOCIETE VALUES (1, 'IBM'); 
    INSERT INTO T_SOCIETE VALUES (2, 'TOTAL'); 
    INSERT INTO T_SOCIETE VALUES (3, 'AIF France'); 
    INSERT INTO T_SOCIETE VALUES (4, 'Renault');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- la table des produits
    CREATE TABLE T_PRODUIT
    (PRD_ID        INT NOT NULL PRIMARY KEY,
     PRD_LIBELLE   VARCHAR(32))
     
    INSERT INTO T_PRODUIT VALUES (1, 'cirage');
    INSERT INTO T_PRODUIT VALUES (2, 'fauteuil');
    INSERT INTO T_PRODUIT VALUES (3, 'TV');
    INSERT INTO T_PRODUIT VALUES (4, 'lapin');
    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
    -- table de jointure entre les produits et les sociétés 
    CREATE TABLE T_J_SOCIETE_PRODUIT
    (SPD_ID        INT NOT NULL PRIMARY KEY,
     PRD_ID        INT FOREIGN KEY REFERENCES T_SOCIETE (STE_ID),
     STE_ID        INT FOREIGN KEY REFERENCES T_PRODUIT (PRD_ID),
     SPD_NOMBRE    INT );
     
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (1, 1, 2, 3);
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (2, 1, 3, 2);
     
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (3, 2, 1, 4);
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (4, 2, 3, 1);
     
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (5, 3, 2, 1);
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (6, 3, 4, 1);
     
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (7, 4, 2, 3);
     
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (8, 3, 2, 1);
     
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (9, 2, 1, 1);
    INSERT INTO T_J_SOCIETE_PRODUIT VALUES (10, 2, 3, 5);
    A +

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

Discussions similaires

  1. Requete avec sum et count
    Par jcserre dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/06/2008, 11h01
  2. Requete COUNT + SUM
    Par Seth77 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/05/2007, 04h42
  3. probleme requete SELECT SUM
    Par Sophie2097 dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/11/2006, 15h14
  4. 1 requete : 2 sum, mais sur le meme champ ...
    Par aergil dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/03/2006, 16h21
  5. Probleme avec requete et sum
    Par Treuze dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/01/2006, 17h28

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