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

MS SQL Server Discussion :

Calcul en pourcentage.


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    189
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2009
    Messages : 189
    Par défaut Calcul en pourcentage.
    Bonjour à tous,
    voila, j'ai un problème avec une requète SQL, sur SQLServer.

    J'ai une table TabReg(NomRegion, CAreg, Population) avec laquelle, j'aimerais calculer le pourcentage des ventes réalisé dans tel ou tel région sur le total des ventes.
    Que le tout soit calculé et insérer dans une nouvelle colonne que je vais créer dan TabReg.

    J'ai tester cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT NomRegion,SUM(TabReg.CAreg) * 100 / Tot.CAreg
    FROM TabReg ,  
     (SELECT SUM(CAreg)
       FROM  TabReg)AS Tot
     
    GROUP BY TabReg.NomRegion
    mais ça ne marche pas, il le dit qu'il n'y a aucune colonne de spécifier pour la colonne 1 de Tot ?!?

    Bref merci à ceux qui pourrons m'aider.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Votre requête est syntaxiquement incorrecte !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT NomRegion, 
           CAST((SELECT SUM(CAreg)
                  FROM  TabReg  
                  WHERE NomRegion = T.NomRegion) AS FLOAT) * 100.0 / CAreg
    FROM   TabReg AS T
    GROUP  BY NomRegion
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez vous en sortir avec une fonction analytique post SQL Server 2005 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT NomRegion,
             SUM(CAreg) * 100.0 / SUM(CAreg) over() as calc
        FROM TabReg 
    GROUP BY NomRegion

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    189
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2009
    Messages : 189
    Par défaut
    Cela ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT NomRegion, 
           CAST((SELECT SUM(CAreg)
                  FROM  TabReg  
                  WHERE NomRegion = T.NomRegion) AS FLOAT) * 100.0 / CAreg
    FROM   TabReg AS T
    GROUP  BY NomRegion
    il me dit que T.CAreg n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.

    Je ne vois pas trop le problème, j'ai essayer de mettre CAreg dans le group by, mais bien entendu cela me donne du 100% partout.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    189
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2009
    Messages : 189
    Par défaut
    Est ce que quelqu'un aurais une idée de ce qui ne va pas dans la requète ?
    Je recherche attivement la réponse.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez, par exemple, lire toutes les réponses qui vous ont été soumises !

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    189
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2009
    Messages : 189
    Par défaut
    Oui, désolé, j'ai oublier de préciser que votre réponse ne fonctionnait pas non plus, car il me dit que la syntaxe est incorrect vers le mot "over".

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    SQL Server 2000 alors ?

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    189
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2009
    Messages : 189
    Par défaut
    C'est cela !

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Votre requête initiale n'était pas trop loin de la solution, elle manquait juste d'alias :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT TR.NomRegion, SUM(TR.CAreg) * 100.0 / SUM(TT.CaTot)
        FROM TabReg AS TR
             CROSS JOIN (SELECT SUM(CAreg) as CaTot FROM TabReg) AS TT
    GROUP BY TR.NomRegion
    On pourrait ne pas faire de SUM sur TT.CaTot et le rajouter dans le group by, comme il n'y a qu'une seule ligne celà n'a pas beaucoup d'importance.

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    189
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2009
    Messages : 189
    Par défaut
    Merci Waldar, votre solution fonctionne, je viens à l'instant d'en trouvé une autre, mais il y a des problèmes dans les deux solutions.

    Votre solutions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     SELECT TR.NomRegion, SUM(TR.CAreg) * 100.0 / SUM(TT.CaTot)
        FROM TabReg AS TR
             CROSS JOIN (SELECT SUM(CAreg) AS CaTot FROM TabReg) AS TT
    GROUP BY TR.NomRegion
    Me donne un résultat avec 12 chiffres après la virgule, ce dont je n'est pas besoin, vu qu'il me faut de l'approximatif, et donc des entier me suffise. Mais au niveau du calcul, votre requète fonctionne.

    La mienne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT NomRegion,SUM(TabReg.CAreg) * 100 / (SELECT SUM(CAreg) FROM  TabReg)
    FROM TabReg
    GROUP BY TabReg.NomRegion
    Problème: lorsque que j'ai un pourcentage de 0.97 par exemple, il me met que cela est égal a 0.
    Y aurait il un moyen de dire:

    Si le % > 0.5 alors mettre 1 ?

    Voila, on avance.
    Merci pour vos réponses.

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Utilisez la fonction ROUND !

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    189
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2009
    Messages : 189
    Par défaut
    Tout à fait, je viens de le modifier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT NomRegion,ROUND(SUM(TabReg.CAreg) * 100 / CAST((SELECT SUM(CAreg) FROM  TabReg)AS FLOAT),0)
    FROM TabReg
    GROUP BY TabReg.NomRegion
    C'est parfait.

    Merci pour tous.

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

Discussions similaires

  1. Calcul de pourcentages
    Par Lypertrophie dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 30/06/2006, 11h25
  2. Reqête avec un calcul de pourcentage
    Par jean-pierre96 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2006, 13h00
  3. Réponses: 1
    Dernier message: 10/01/2006, 20h35
  4. calcul de pourcentage
    Par PAUL87 dans le forum Access
    Réponses: 12
    Dernier message: 20/09/2005, 19h50
  5. Calcul de pourcentage
    Par megazen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/11/2003, 16h43

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