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

Requêtes MySQL Discussion :

Calcul de % dans un CASE


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut Calcul de % dans un CASE
    Bonsoir,

    J'essaye de réaliser plusieurs CASE representant des semaines, je souhaites calculer un pourcentage mais apparement le CASE n'apprecie pas et me retourne le message d'erreur suivant.
    Pourriez-vous m'éclairer.

    Cannot perform an aggregate function on an expression containing an aggregate or a subquery


    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
    23
    24
    25
    26
    27
    28
    29
    30
     
    SELECT AccountName
         , sum(CASE
                 WHEN Weeknum = 30 THEN
                   (PlnHours / nullif(sum(Hrs), 0) * 100)
                 ELSE
                   0
               END) AS [30]
         , sum(CASE
                 WHEN Weeknum = 31 THEN
                   (PlnHours / nullif(sum(Hrs), 0) * 100)
                 ELSE
                   0
               END) AS [31]
         , sum(CASE
                 WHEN Weeknum = 32 THEN
                   (PlnHours / nullif(sum(Hrs), 0) * 100)
                 ELSE
                   0
               END) AS [32]
         , sum(CASE
                 WHEN Weeknum = 33 THEN
                   (PlnHours / nullif(sum(Hrs), 0) * 100)
                 ELSE
                   0
               END) AS [33]
    FROM
      tblresult
    GROUP BY
      AccountName

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Si on supprime le CASE, ça donne ça pour le premier calcul :
    Une somme de somme, ça ne peut pas fonctionner car il faudrait un GROUP BY imbriqué dans un autre.

    Que voulez-vous calculer exactement ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut
    Bonjour CinePhil,

    J'ai une table qui correspond à ceci:

    Weeknum......AccountName.......PlnHours......Hrs
    30...............OX......................20.............25
    30...............OX......................22.............24
    31...............OX......................21.............26
    31...............OX......................24.............28

    Et je souhaite obtenir le resultat suivant en faisant la somme des 'PlnHours' et des 'Hrs' pour cahque semaine et caluler le pourcentage en faisant 'PlnHours'/'Hrs' :

    AccountName.......30........31
    OX.....................86%......83%

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Essaie comme ça :
    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
    SELECT AccountName,
    	CASE
    		WHEN Weeknum = 30 THEN pourcentage
    		ELSE 0
    	END AS '30',
    	CASE
    		WHEN Weeknum = 31 THEN pourcentage
    		ELSE 0
    	END AS '31',
    	CASE
    		WHEN Weeknum = 32 THEN pourcentage
    		ELSE 0
    	END AS '32'
    FROM
    (
    	SELECT AccountName, Weeknum,
    		100 * SUM(PlnHours) / SUM(Hrs) AS pourcentage
    	FROM tblresult
    	GROUP BY AccountName, Weeknum
    ) tmp
    Mais c'est de la cosmétique ton truc !
    Si c'est pour afficher dans un logiciel, tu devrais plutôt gérer l'affichage en colonnes dans le logiciel applicatif.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut
    Je suis d'accord qu'il s'agit là de Cosmetique, ta proposition me retourne 3 lignes, j'ai donc lu et appliqué l'exemple du tuto et sa fonctionne.
    Maintenant je ne sais pas si c'est tres propre comme requete.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    SELECT S.AccountName
         , sum(S.CA_T1) AS CA_T1
         , sum(S.CA_T2) AS CA_T2
         , sum(S.CA_T3) AS CA_T3
         , sum(S.CA_T4) AS CA_T4
    FROM
      (SELECT AccountName
            , 100 * sum(PlnHours) / sum(Hrs) AS CA_T1
            , 0.0 AS CA_T2
            , 0.0 AS CA_T3
            , 0.0 AS CA_T4
       FROM
         tblresult
       WHERE
         Weeknum = '30'
       GROUP BY
         AccountName
       UNION
       SELECT AccountName
            , 0.0 AS CA_T1
            , 100 * sum(PlnHours) / sum(Hrs) AS CA_T2
            , 0.0 AS CA_T3
            , 0.0 AS CA_T4
       FROM
         tblresult
       WHERE
         Weeknum = '31'
       GROUP BY
         AccountName
       UNION
       SELECT AccountName
            , 0.0 AS CA_T1
            , 0.0 AS CA_T2
            , 100 * sum(PlnHours) / sum(Hrs) AS CA_T3
            , 0.0 AS CA_T4
       FROM
         tblresult
       WHERE
         Weeknum = '32'
       GROUP BY
         AccountName
       UNION
       SELECT AccountName
            , 0.0 AS CA_T1
            , 0.0 AS CA_T2
            , 0.0 AS CA_T3
            , 100 * sum(PlnHours) / sum(Hrs) AS CA_T4
       FROM
         tblresult
       WHERE
         Weeknum = '33'
       GROUP BY
         AccountName) AS S
    GROUP BY
       S.AccountName

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

Discussions similaires

  1. Calcul suivant lettre dans une case annexe
    Par snowcho dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 10/02/2010, 12h45
  2. Tableaux-->faire un roll-over dans une case
    Par gwendy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/12/2005, 12h04
  3. Affichage différent selon texte dans une case
    Par pingoo78 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 16h32
  4. Plusieurs CALCULS somme dans un ETAT
    Par dynxd dans le forum IHM
    Réponses: 2
    Dernier message: 28/09/2005, 16h45
  5. Calculs complexes dans une requête
    Par ARRG dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/06/2005, 19h11

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