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 :

Division par la somme d'un champ


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 116
    Points : 49
    Points
    49
    Par défaut Division par la somme d'un champ
    Bonjour à tous,

    J'essaie de créer une requête SQL me permettant de diviser un champ par sa sommation. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Annee     Canal     Valeur
    2011      01        1872
    2010      01        2978
    2009      01        3874
    2011      02        2983
    2010      02        1234
    Je désire donc récupérer ces données:
    Canal 01 - Année 2011 : 21,46%
    Canal 01 - Année 2010 : 34,14%
    Canal 01 - Année 2009 : 44,41%

    Canal 02 - Année 2011 : 70,74%
    Canal 02 - Année 2010 : 29,26%
    Il s'agit donc de diviser la "Valeur" de chaque ligne par la sommation de la colonne "Valeur" groupée par année & canal.

    Si quelqu'un pourrait m'aider, ce serait grandement apprécié !!

    Merci

    *NOTE: Je travail sous Access 2007...

    *EDIT: Actuellement, mon code ressemble à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_EXCEL_Demande.NoAnnPre, T_PIL_Canaux.CodeCan, T_EXCEL_Demande.Total, Sum(T_EXCEL_Demande_1.Total) AS SommeDeTotal, IIf(T_EXCEL_Demande.Total=0,0,[T_EXCEL_Demande]![Total]/Sum([T_EXCEL_Demande_1]![Total])) AS Pourcent
    FROM (T_EXCEL_Demande INNER JOIN T_EXCEL_Demande AS T_EXCEL_Demande_1 ON T_EXCEL_Demande.NoCan = T_EXCEL_Demande_1.NoCan) INNER JOIN T_PIL_Canaux ON T_EXCEL_Demande.NoCan = T_PIL_Canaux.NoCan
    WHERE (((T_EXCEL_Demande.NoAnnPre)=0))
    GROUP BY T_EXCEL_Demande.NoAnnPre, T_PIL_Canaux.CodeCan, T_EXCEL_Demande.Total;
    Cependant, la colonne "Total" retourne des valeurs impossibles et plutôt que d'avoir ~100 occurrences, il m'en retourne ~1000.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonsoir,


    Vous vous y prenez à l'envers fait.

    votre sous-requete va être le resultat de l'agrégation (somme des valeur par canaux).

    Ce résultat va être pris pour faire votre division, en utilisant une jointure.


    Donc essayez dans l'autre sens car vous n'êtes pas loin de la solution

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Je crois bien avoir un soucis au niveau de la jointure, car je n'arrive même pas à exécuter ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_EXCEL_Demande.NoCan, T_EXCEL_Demande.NoAnnPre
    FROM T_EXCEL_Demande INNER JOIN T_EXCEL_Demande AS T_EXCEL_Demande_1 ON T_EXCEL_Demande.NoCan = T_EXCEL_Demande_1.NoCan
    ORDER BY T_EXCEL_Demande.NoCan, T_EXCEL_Demande.NoAnnPre;
    Celui-ci me dit que je dépasse les 2 Gigs alloués -.-

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Faut voir que là vous faites une jointure inutile qui va dupliquer plein de donnée.

    Donc même si vous arrivez aux limites de votre "SGBD" le résultat n'aurait pas été probant.

    Je pensais plutôt à une solution de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select annee, nocan, valeur, valeur / sum_val * 100
    from a_table a
    inner join (
    select annee, nocan, sum(valeur) as val_sum
    from ma_table
    where noAnnPre = 0
    group by anne, nocan) B on a.annee = b.annee and a.nocan = b.nocan
    where b.noAnnPre = 0

  5. #5
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select A.annee,A.NoCan,valeur/somme_valeur*100 
    from la_table A 
    JOIN
    (select sum(valeur)somme_valeur,NoCan 
    from la_table 
    group by NoCan)B 
    on
    A.NoCan= B.NoCan
    order by A.NoCan
    Resulat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       	   	ANNEE	NOCAN	pourcentage	
                 2011	1	21,4580467675378
    	2010	1	34,1357175607519
    	2009	1	44,4062356717102
    	2011	2	70,7374911074223
    	2010	2	29,2625088925777
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    après ma dernière réunion, le but a quelque peu changé mais le tout reste dans la même lignée... En fait, celui-ci veut obtenir le ratio de canal PAR ANNÉE... Exemple, canal 1: 90%, canal 2: 10% pour l'année 1, canal 1: 60%, canal 2: 40% pour l'année 2 etc... Ainsi, je dois obtenir la somme de valeurs de tous les canaux de l'année divisée par la somme de total d'un seul canal pour cette même année.

    Comme le diviseur que vous m'aviez proposé représente le nombre divisé, j'ai tenté la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT a.NoAnnPre, a.NoCan, Sum(a.Total) AS SommeDeTotal, sum(sum_val) AS SommeDesum_val
    FROM T_EXCEL_Demande AS a INNER JOIN (SELECT  NoAnnPre, NoCan, sum(Total) AS sum_val
    FROM T_EXCEL_Demande
    WHERE noAnnPre = 0
    GROUP BY NoAnnPre, NoCan)  AS b ON (a.NoCan = b.NoCan) AND (a.NoAnnPre = b.NoAnnPre)
    WHERE (((b.NoAnnPre)=0))
    GROUP BY a.NoAnnPre, a.NoCan;
    Cependant, mon diviseur ne donne pas le bon résultat. Par exemple, je récupère la valeur 1589559120 pour le canal 1 plutôt que 19654974.

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    avez-vous compris le principe d'agrégation en SQL ?

    Tenez : http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    Avec ceci et la requête de Boussafi (à modifier) je penses que vous devriez arriver à vos fin sans trop de souci.


    Commencez par la sous-requête et réfléchissez aux jointures necessaires ..

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    Je suis au regret de devoir vous décevoir, car je ne comprend pas d'où provient l'erreur... L'agrégation me semble correcte, je groupe par année et par canaux. Ma sous-requête (celle incluse dans le join) me retourne les bons résultats, tout ce que je fais dans ma requête originale est d'effectuer une somme des résultats de celle-ci.

    Si je retire mon groupage par Année et Canaux, je reçois une erreur comme quoi ces expressions manquent à la fonction d'agrégat.

    De plus, si j'essaie de diviser mes deux nombres (malgré que la somme des totaux ne soit pas bonne), je reçois une constante erronée...

    Voici mon dernier code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.NoAnnPre, A.NoCan, Sum(A.total) AS SommeDeValeur, Sum(b.somme_valeur) AS SommeDeTotal, SommeDeValeur/SommeDeTotal AS Expr1
    FROM T_EXCEL_Demande AS A 
    INNER JOIN (SELECT sum(Total) as somme_valeur,NoCan, NoAnnPre
    FROM T_EXCEL_Demande
    GROUP BY NoCan, NoAnnPre)  AS b ON (A.NoCan = b.NoCan) AND (A.NoAnnPre = b.NoAnnPre)
    GROUP BY A.NoAnnPre, A.NoCan;
    PS: La fonction "join" seule ne semble pas fonctionner sous Access

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par Norin Voir le message
    Je suis au regret de devoir vous décevoir, car je ne comprend pas d'où provient l'erreur...
    C'est à cause de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SommeDeValeur/SommeDeTotal AS Expr1
    Tu n'as pas accès aux alias puisque tu es au même niveau.
    Il faut le remplacer par les vrai sum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.NoAnnPre, A.NoCan, 
           Sum(A.total) AS SommeDeValeur, 
           Sum(b.somme_valeur) AS SommeDeTotal, 
           Sum(A.total)/Sum(b.somme_valeur) AS Expr1
    ...
    Enfin ce que je dis concerne l'erreur, je n'ai pas particulièrement regardé la requette couplée au besoin pour savoir si cette division correspond...

    [Edit]
    Ainsi, je dois obtenir la somme de valeurs de tous les canaux de l'année divisée par la somme de total d'un seul canal pour cette même année.
    Tu es sûr que ce n'est pas l'inverse ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    C'est à cause de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SommeDeValeur/SommeDeTotal AS Expr1
    Tu n'as pas accès aux alias puisque tu es au même niveau.
    Il faut le remplacer par les vrai sum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.NoAnnPre, A.NoCan, 
           Sum(A.total) AS SommeDeValeur, 
           Sum(b.somme_valeur) AS SommeDeTotal, 
           Sum(A.total)/Sum(b.somme_valeur) AS Expr1
    ...
    Enfin ce que je dis concerne l'erreur, je n'ai pas particulièrement regardé la requette couplée au besoin pour savoir si cette division correspond...
    J'obtiens le même résultat... Je ne reçois pas une erreur à proprement dire, seulement un résultat faussé

    Pour ce que j'ai à obtenir, je vais refaire un petit tableau car je trouve que ceux-ci sont beaucoup plus exhaustif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Annee     Canal     Valeur     Pourcent
    2011      01        1000       16,67% (1000 / (1000 + 2000 + 3000))
    2011      02        2000       33,33%
    2011      03        3000       50,00%
    2010      01        4000       80,00%
    2010      03        1000       20,00%

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Regarde mon edit plus haut :

    Tu es sûr que ce n'est pas l'inverse ?

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT sum(Total) AS somme_valeur,NoCan, NoAnnPre
    FROM T_EXCEL_Demande
    GROUP BY NoCan, NoAnnPre
    ceci est votre sous-requête.

    Et le group by est incohérent par rapport à ce que vous demandez (j'en déduis que ma 1ere proposition ne devait pas marcher au mieux !)

    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT sum(Total) AS somme_valeur, NoAnnPre
    FROM T_EXCEL_Demande
    GROUP BY NoAnnPre

    donc au final je ferai ça, qui doit coller avec votre demande..sinon reformulez votre demande


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.NoAnnPre, A.NoCan, a.valeur, valeur/somme_valeur * 100 AS Expr1
    FROM T_EXCEL_Demande AS A 
    INNER JOIN (SELECT sum(Total) AS somme_valeur, NoAnnPre
    FROM T_EXCEL_Demande
    GROUP BY  NoAnnPre)  AS b ON  (A.NoAnnPre = b.NoAnnPre)



    edit : ceci a déjà été remonté par skuatamad, désolé
    Sinon dans votre requête proposée il y a un problème dans le select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT A.NoAnnPre, A.NoCan, 
    Sum(A.total) AS SommeDeValeur, 
    Sum(b.somme_valeur) AS SommeDeTotal, 
    SommeDeValeur/SommeDeTotal AS Expr1
    FROM T_EXCEL_Demande AS A 
    INNER JOIN (SELECT sum(Total) AS somme_valeur,NoCan, NoAnnPre
    FROM T_EXCEL_Demande
    GROUP BY NoCan, NoAnnPre)  AS b ON (A.NoCan = b.NoCan) AND (A.NoAnnPre = b.NoAnnPre)
    GROUP BY A.NoAnnPre, A.NoCan;

    En effet SommeDeValeur & SommeDeTotal ne sont définis qu'au résultat de votre requête et ne peuvent donc pas être réutilisés dans le même select ! (d'où votre erreur)
    il faudrait pour cela refaire une sous-requête afin de faire le calcul que vous souhaitez

  13. #13
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    remarque pour Norin, il manque les feedback des reponses de ton besoin

    calcule de somme de valeur par année
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select sum(valeur)somme_valeur,annee 
    from la_table 
    group by annee

    deviser chaque valeur d'une année donnée par la somme des valeurs de la meme année.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select A.annee,A.canal,valeur/somme_valeur*100 
    from la_table A 
    JOIN
    (select sum(valeur)somme_valeur,annee 
    from la_table 
    group by annee)B 
    on
    A.annee= B.annee
    order by A.annee desc

    affichage du resulat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       	ANNEE	CANAL	VALEUR/SOMME_VALEUR*100
    	2011	1	16,6666666666667
    	2011	2	33,3333333333333
    	2011	3	50
    	2010	3	20
    	2010	1	80

    ton feedkack j'attends
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Bonjour,
    Désolé pour le délai des feedbacks, je ne peux travailler sur cette requête que lorsque l'accès à la base de données est disponible.

    Boussafi, j'ai essayé votre requête et celle-ci me retourne 46k résultats plutôt que 128.

    Pour cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.NoAnnPre, A.NoCan, 
    Sum(A.total) AS SommeDeValeur, 
    Sum(b.somme_valeur) AS SommeDeTotal, 
    sum(total)/sum(somme_valeur) AS Expr1
    FROM T_EXCEL_Demande AS A 
    INNER JOIN (SELECT sum(Total) AS somme_valeur,NoCan, NoAnnPre
    FROM T_EXCEL_Demande
    GROUP BY NoCan, NoAnnPre)  AS b ON (A.NoCan = b.NoCan) AND (A.NoAnnPre = b.NoAnnPre)
    GROUP BY A.NoAnnPre, A.NoCan;
    Le résultat me retourne bel et bien 128 résultats, la colonne SommeDeValeur est exacte (elle retourne le bon nombre à être divisé) cependant le diviseur (SommeDeTotal) n'est guère le bon et le résultat dans Expr1 ne fait aucun sens car il est répété malgré les changements de SommeDeValeur et SommeDeTotal.

    J'ai mis en pièce jointe une portion visible du résultat de la requête (resultat.JPG), le détail de la table T_EXCEL_Demande (table.JPG) ainsi que le résultat des totaux de valeurs (totaux.JPG).

    Si l'on prend l'image contenant les totaux de valeurs, je désire obtenir, pour l'année 0 et le canal 1 par exemple, 4415442/(4415442 + 4880766 + 277128 + 600131 + 340191 + 2440883 + 1556296 + 5144137) donc, 22.46% séparés ainsi: année, canal (comme dans le fichier ).

    En espérant être un peu plus clair sur mes besoins :S

    Un très grand merci à tous !
    Images attachées Images attachées    

  15. #15
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    J'ai un peu survolé la discussion mais, si je comprends bien, tu veux le pourcentage de chaque canal par année ?
    Il ne faut pas inclure le canal dans le groupement de la sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT A.NoAnnPre, A.NoCan, 
        Sum(A.total) AS SommeDeValeur, 
        Sum(b.somme_valeur) AS SommeDeTotal, 
        sum(A.total)/sum(b.somme_valeur) AS Expr1
    FROM T_EXCEL_Demande AS A 
    INNER JOIN 
    (
        SELECT sum(Total) AS somme_valeur, NoAnnPre
        FROM T_EXCEL_Demande
        GROUP BY NoAnnPre
    )  AS b ON A.NoAnnPre = b.NoAnnPre
    GROUP BY A.NoAnnPre, A.NoCan;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    J'ai un peu survolé la discussion mais, si je comprends bien, tu veux le pourcentage de chaque canal par année ?
    Il ne faut pas inclure le canal dans le groupement de la sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT A.NoAnnPre, A.NoCan, 
        Sum(A.total) AS SommeDeValeur, 
        Sum(b.somme_valeur) AS SommeDeTotal, 
        sum(A.total)/sum(b.somme_valeur) AS Expr1
    FROM T_EXCEL_Demande AS A 
    INNER JOIN 
    (
        SELECT sum(Total) AS somme_valeur, NoAnnPre
        FROM T_EXCEL_Demande
        GROUP BY NoAnnPre
    )  AS b ON A.NoAnnPre = b.NoAnnPre
    GROUP BY A.NoAnnPre, A.NoCan;
    Merci pour votre aide, cependant, le diviseur de votre requête pour l'année 0 par exemple retourne 7075790640 plutôt que 19654974

    EDIT: OHMIGOD!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT A.NoAnnPre, A.NoCan, 
        Sum(A.total) AS SommeDeValeur, 
        b.somme_valeur AS SommeDeTotal, 
        sum(A.total)/b.somme_valeur AS Expr1
    FROM T_EXCEL_Demande AS A 
    INNER JOIN 
    (
        SELECT sum(Total) AS somme_valeur, NoAnnPre
        FROM T_EXCEL_Demande
        GROUP BY NoAnnPre
    )  AS b ON A.NoAnnPre = b.NoAnnPre
    GROUP BY A.NoAnnPre, A.NoCan, b.somme_valeur;
    Cette requête fonctionne parfaitement ! Je ne comprends pas trop pourquoi, mais ça fonctionne !!! Merci à tous !

    PS: Si quelqu'un peut m'expliquer, je suis preneur... Depuis 2 jours je fais surtout des essais à l'aveuglette et ça a finalement fonctionné

  17. #17
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tout simplement : la sous-requête calcule la somme de tous les canaux par année et la requête principale utilise la sous-requête comme diviseur pour avoir la proportion par année et par canal.

    EDIT :
    Effectivement, je n'avais pas vu qu'il ne fallait pas sommer le total par année !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41
  2. Division par 16 en C
    Par hermannd dans le forum C
    Réponses: 18
    Dernier message: 13/02/2004, 14h10
  3. [LG]a divise par b
    Par backsync dans le forum Langage
    Réponses: 8
    Dernier message: 22/10/2003, 21h37
  4. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14
  5. Valeur par defaut 'True' dans un champ de type bit
    Par Mouse dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2003, 15h26

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