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

SSRS Discussion :

[SSRS][2K5]Comment diviser deux colonnes (avec une issue d'un calcul) dans un dataset


Sujet :

SSRS

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2008
    Messages : 59
    Points : 52
    Points
    52
    Par défaut [SSRS][2K5]Comment diviser deux colonnes (avec une issue d'un calcul) dans un dataset
    Bonjour à toutes et à tous,
    Je travaille actuellement sur une requête qui doit me permettre d'obtenir un pourcentage en divisant la colonne 'a' par la colonne 'b', cependant la colonne 'b' est issue d'un calcul (une formule Sum()).
    Pour que ma requête puisse s'exécuter je dois introduire une instruction GROUP BY qui regroupe les résultats selon leur nomenclature. Le problème que je rencontre est le suivant :
    La colonne 'b' ne me donne pas une somme mais la valeur de chaque opérande (toutes les valeurs qui sont sommées), par conséquence je n'obtiens pas un ratio comme je le souhaite mais le chiffre 1 (la valeur de la colonne 'a' et celle de la colonne 'b' sont identiques, donc la division de l'une par l'autre donne 1).
    Pourriez-vous m'apporter une solution efficace pour résoudre ce problème, merci.

    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     { fn CONCAT(m.libelle_en, CAST(h.Annee AS varchar)) } AS Date, en.libelle_niveau_2 AS lib_en2, en.libelle_niveau_1 AS lib_en, en.id_niveau_1,
                              (SELECT     h2.Montant
                                FROM          headcount AS h2 INNER JOIN
                                                       nomenclature_en AS en2 ON en2.Nomenclature = h2.Nomenclature
                                WHERE      (h2.Mois = h.Mois) AND (h2.Annee = h.Annee) AND (en2.id_niveau_1 = en.id_niveau_1) AND (h2.Nomenclature = h.Nomenclature)) 
                          /
                              (SELECT     SUM(h.Montant) AS sum
                                FROM          headcount AS h3 INNER JOIN
                                                       nomenclature_en AS en3 ON en3.Nomenclature = h3.Nomenclature
                                WHERE      (h3.Mois = h.Mois) AND (h3.Annee = h.Annee) AND (en3.id_niveau_1 = en.id_niveau_1) AND (h3.Nomenclature = h.Nomenclature)
                                GROUP BY h3.Annee, h3.Mois) AS div
    FROM         headcount AS h INNER JOIN
                          nomenclature_en AS en ON h.Nomenclature = en.Nomenclature INNER JOIN
                          month_name AS m ON h.Mois = m.Numero
    WHERE     (en.id_niveau_1 = 'DIV') AND (h.Annee = @minYear) AND (h.Mois >= @month) OR
                          (en.id_niveau_1 = 'DIV') AND (h.Annee > @minYear) AND (h.Annee < @maxYear) OR
                          (en.id_niveau_1 = 'DIV') AND (h.Annee = @maxYear) AND (h.Mois <= @month)
    GROUP BY h.Annee, h.Mois, en.libelle_niveau_1, m.libelle_en, en.libelle_niveau_2, h.Nomenclature, en.id_niveau_1
    ORDER BY h.Annee, h.Mois
    Voici le résultat obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
             Date              lib_en2       lib_en     id_niveau_1 div
    -------------------------------------------------------------------------
    	January   2003	Administration	Division	DIV	1
    	January   2003	Engineers	 Division	DIV	1
    	January   2003	Administration	Division	DIV	1
    	January   2003	Administration	Division	DIV	1
    	January   2003	Administration	Division	DIV	1
    	January   2003	Service	        Division	DIV	1
    	February  2003	Administration	Division	DIV	1
    	February  2003	Engineers	 Division	DIV	1
    	February  2003	Administration	Division	DIV	1
    	February  2003	Administration	Division	DIV	1
    	February  2003	Administration	Division	DIV	1

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Salut,

    J'avoue que ce n'est pas trop mon fort de corriger une requête quand je n'ai pas accès aux données...

    As-tu pensé à utiliser les CTE (Common Table Expression) pour résoudre ton problème?

    Une CTE est (pour faire simple) un résultat temporaire généré par une requête que tu peux directement utiliser dans une autre requête (par une jointure ou un autre mécanisme).

    Voici la syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    with CTE_Name
    as
    (
            select ... from ... 
    )
    select ... from ...
    Dans la requête après la CTE, tu peux donc faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select ..., CTE_Name.Colonne1 from ... join CTE_Name on ... = ... where ...
    Personnellement, je les utilise beaucoup. Elles sont super pratiques et surtout efficaces.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2008
    Messages : 59
    Points : 52
    Points
    52
    Par défaut
    Merci psychokwax,
    Je me suis renseigné sur les CTE et leur utilisation et cela me paraîs très intéressant cependant je crois pouvoir éviter d'en utiliser une avec le code ci-dessous. Le problème que je rencontre ne me semble pas très clair : je m'explique. Lorsque je teste ma requête et que j'effectue une addition ou une soustraction le résultat est correct, malheureusement pour moi je souhaite diviser. Le problème est que lorsque je divise automatiquement tous les résultats sont à 0 !

    Voici donc mon code :
    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     { fn CONCAT(m.libelle_en, CAST(h.Annee AS varchar)) } AS Date, en.libelle_niveau_2 AS lib_en2,
                              (SELECT     SUM(h2.Montant) AS Expr1
                                FROM          headcount AS h2 INNER JOIN
                                                       nomenclature_en AS en2 ON en2.Nomenclature = h2.Nomenclature
                                WHERE      (h2.Mois = h.Mois) AND (h2.Annee = h.Annee) AND (en2.libelle_niveau_1 = en.libelle_niveau_1) AND 
                                                       (en2.libelle_niveau_2 = en.libelle_niveau_2)
                                GROUP BY en2.libelle_niveau_2) /
                              (SELECT     SUM(h3.Montant) AS sum
                                FROM          headcount AS h3 INNER JOIN
                                                       nomenclature_en AS en3 ON en3.Nomenclature = h3.Nomenclature
                                WHERE      (h3.Mois = h.Mois) AND (h3.Annee = h.Annee) AND (en3.id_niveau_1 = 'DIV')) AS div
    FROM         headcount AS h INNER JOIN
                          nomenclature_en AS en ON h.Nomenclature = en.Nomenclature INNER JOIN
                          month_name AS m ON h.Mois = m.Numero
    WHERE     (en.id_niveau_1 = 'DIV') AND (h.Annee = @minYear) AND (h.Mois >= @month) OR
                          (en.id_niveau_1 = 'DIV') AND (h.Annee > @minYear) AND (h.Annee < @maxYear) OR
                          (en.id_niveau_1 = 'DIV') AND (h.Annee = @maxYear) AND (h.Mois <= @month)
    GROUP BY h.Annee, h.Mois, m.libelle_en, en.libelle_niveau_1, en.libelle_niveau_2
    ORDER BY h.Annee, h.Mois
    Avec ce code j'obtiens donc toujours les résultats suivants (les colonnes correspondent dans l'ordre de gauche à droite : Date, Lib_en2 et div)
    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
     
    January   2007	Administration	0
    January   2007	Engineers	0
    January   2007	Plant operation	0
    January   2007	Service	        0
    February  2007	Administration	0
    February  2007	Engineers	0
    February  2007	Plant operation	0
    February  2007	Service	        0
    March     2007	Administration	0
    March     2007	Engineers       0
    March     2007	Plant operation	0
    March     2007	Service	        0
    April     2007	Administration	0
    April     2007	Engineers	0
    Si je modifie le signe / qui apparaît en gras et en bleu par l'opérateur - (pour la soustraction donc) j'obtiens les résultats suivants qui sont corrects eux !
    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
     
    	January   2007	Administration	-190
    	January   2007	Engineers	 -143
    	January   2007	Plant operation	-197
    	January   2007	Service	        -139
    	February  2007	Administration	-193
    	February  2007	Engineers	 -145
    	February  2007	Plant operation	-200
    	February  2007	Service	        -140
    	March     2007	Administration	-192
    	March     2007	Engineers	 -146
    	March     2007	Plant operation	-198
    	March     2007	Service	        -139
    	April     2007	Administration	-200
    	April     2007	Engineers	 -153

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 265
    Points : 314
    Points
    314
    Par défaut
    La division de 2 entiers te renvoie un entier, c'est le mode de fonctionnement du T-SQL:
    http://msdn.microsoft.com/en-us/library/ms175009.aspx

    Il faut que tu cast tes champs Montant en float ou en numeric pour obtenir le résultat souhaité.

    Si ton compte utiliser ces données dans SSRS, je te conseille plutôt le type numeric. Il me semble que SSRS a du mal avec les nombres à virgule flottante.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2008
    Messages : 59
    Points : 52
    Points
    52
    Par défaut Problème résolu, merci dabratt !
    dabratt je vous remercie pour votre intervention très perspicace, la solution à mon problème se résume en effet à un 'simple' CAST !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/03/2013, 12h58
  2. Réponses: 1
    Dernier message: 08/07/2008, 16h29
  3. Réponses: 2
    Dernier message: 19/06/2008, 18h23
  4. Réponses: 2
    Dernier message: 16/06/2008, 13h32
  5. Réponses: 6
    Dernier message: 20/05/2008, 16h35

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