2017-10-16 16 views
0

J'utilise SSRS 2008r2. Je dois ajouter une colonne pour le pourcentage du total qui semble simple, mais j'ai lutté avec cela pendant une semaine et j'ai lu de nombreux messages sur les problèmes de pourcentage et n'ai rien trouvé qui fonctionne.Calcul pour Pourcentage du total (par rangée) donnant #Error

Fondamentalement, ma question est quelle est la meilleure façon de le faire - dans le corps du rapport ou dans le code SQL? et puis quelqu'un peut-il aider à faire fonctionner ça?

Ce que je l'ai fait jusqu'à présent:

Image of SSRS layout En SSRS j'ai ajouté une expression dans la colonne de fin de diviser le nombre d'enregistrements par type par la valeur de la ligne totale: = Les champs WebCommsPrefContact!. Valeur/ReportItems! WebCommsPrefContact1 et j'ai formaté la cellule d'expression en format de pourcentage dans 'Propriétés de la zone de texte'. Cependant, les résultats montrent une erreur. J'ai lu beaucoup de messages à ce sujet, mais ils semblent tous se référer à la division par zéro, mais la ligne totale ne contiendra jamais un zéro. Results from ReportItems use

J'ai alors pensé que je dois peut-être ajouter le pourcentage en colonne dans mon code SQL: Le code d'origine:

SELECT DISTINCT cp.tsg_communicationpreferencetypeidname AS WebCommsPrefType, con.tsg_contactuid AS WebCommsPrefContact 
FROM   Filteredccx_communicationpreference AS cp INNER JOIN 
         FilteredContact AS con ON cp.ccx_contact = con.contactid INNER JOIN 
         FilteredAccount AS comp ON con.accountid = comp.accountid 
WHERE  (cp.ccx_informationsource = 803080004) AND (con.statecode = 0) AND (cp.createdon BETWEEN '2016/11/25' AND '2017/10/13') AND (NOT EXISTS 
          (SELECT  tsg_companyuid 
           FROM   FilteredAccount 
           WHERE  (comp.tsg_companyuid IN ('COMP00153968', 'COMP00091748', 'COMP00177586', 'COMP00231427', 'COMP00077428', 'COMP00077490', 'COMP00255796')))) AND 
         (cp.tsg_communicationpreferencecategoryidname LIKE 'Category 4%') AND (cp.ccx_status = 803080000) 
ORDER BY WebCommsPrefType 

J'ai essayé d'ajouter une nouvelle colonne en ajoutant une nouvelle sous-requête en la ligne de sélection mais qui a abouti à tous les zéros: (dans cet extrait j'essaie toujours d'obtenir le nombre total de lignes donc pas encore ajouté dans la partie division pour obtenir le résultat en pourcentage) - La syntaxe n'est évidemment pas correcte

SELECT DISTINCT cp.tsg_communicationpreferencetypeidname AS WebCommsPrefType, con.tsg_contactuid AS WebCommsPrefContact, 
count(select Filteredccx_communicationpreference.tsg_communicationpreferencetypeidname AS WebCommsPrefType, FilteredContact.tsg_contactuid AS WebCommsPrefContact 
         FROM   Filteredccx_communicationpreference INNER JOIN 
               FilteredContact ON Filteredccx_communicationpreference.ccx_contact = FilteredContact.contactid INNER JOIN 
               FilteredAccount ON FilteredContact.accountid = FilteredAccount.accountid 
         WHERE  ( Filteredccx_communicationpreference.ccx_informationsource = 803080004) AND (FilteredContact.statecode = 0) AND (Filteredccx_communicationpreference.createdon BETWEEN '2016/11/25' AND '2017/10/13') AND (NOT EXISTS 
                (SELECT  tsg_companyuid 
                 FROM   FilteredAccount 
                 WHERE  (FilteredAccount.tsg_companyuid IN ('COMP00153968', 'COMP00091748', 'COMP00177586', 'COMP00231427', 'COMP00077428', 'COMP00077490', 'COMP00255796')))) AND 
               ( Filteredccx_communicationpreference.tsg_communicationpreferencecategoryidname LIKE 'Category 4%') AND (Filteredccx_communicationpreference.ccx_status = 803080000)) as RecordCount 


From 
        Filteredccx_communicationpreference AS cp INNER JOIN 
         FilteredContact AS con ON cp.ccx_contact = con.contactid INNER JOIN 
         FilteredAccount AS comp ON con.accountid = comp.accountid 
WHERE  (cp.ccx_informationsource = 803080004) AND (con.statecode = 0) AND (cp.createdon BETWEEN '2016/11/25' AND '2017/10/13') AND (NOT EXISTS 
          (SELECT  tsg_companyuid 
          FROM   FilteredAccount 
          WHERE  (comp.tsg_companyuid IN ('COMP00153968', 'COMP00091748', 'COMP00177586', 'COMP00231427', 'COMP00077428', 'COMP00077490', 'COMP00255796')))) AND 
         (cp.tsg_communicationpreferencecategoryidname LIKE 'Category 4%') AND (cp.ccx_status = 803080000) 

J'ai alors pensé que je devais peut-être ajouter une jointure interne à une table pour obtenir le nombre total de lignes.

SELECT DISTINCT cp.tsg_communicationpreferencetypeidname AS WebCommsPrefType, count(con.tsg_contactuid) AS WebCommsPrefContact, count(con.tsg_contactuid)/count(X.PContact) as percentage 
FROM   Filteredccx_communicationpreference AS cp INNER JOIN 
         FilteredContact AS con ON cp.ccx_contact = con.contactid INNER JOIN 
         FilteredAccount AS comp ON con.accountid = comp.accountid Inner join 
         (select Distinct Filteredccx_communicationpreference.tsg_communicationpreferencetypeidname AS WebCommsPrefType, FilteredContact.tsg_contactuid as PContact 
         FROM   Filteredccx_communicationpreference INNER JOIN 
         FilteredContact ON Filteredccx_communicationpreference.ccx_contact = FilteredContact .contactid INNER JOIN 
         FilteredAccount ON FilteredContact.accountid = FilteredAccount.accountid 
          WHERE  (Filteredccx_communicationpreference.ccx_informationsource = 803080004) AND (FilteredContact.statecode = 0) AND (Filteredccx_communicationpreference.createdon BETWEEN '2016/11/25' AND '2017/10/16') AND (NOT EXISTS 
          (SELECT  tsg_companyuid 
           FROM   FilteredAccount 
           WHERE  (FilteredAccount.tsg_companyuid IN ('COMP00153968', 'COMP00091748', 'COMP00177586', 'COMP00231427', 'COMP00077428', 'COMP00077490', 'COMP00255796')))) AND 
         (Filteredccx_communicationpreference.tsg_communicationpreferencecategoryidname LIKE 'Category 4%') AND (Filteredccx_communicationpreference.ccx_status = 803080000)) as X ON cp.ccx_contact=X.PContact 

WHERE  (cp.ccx_informationsource = 803080004) AND (con.statecode = 0) AND (cp.createdon BETWEEN '2016/11/25' AND '2017/10/16') AND (NOT EXISTS 
          (SELECT  tsg_companyuid 
           FROM   FilteredAccount 
           WHERE  (comp.tsg_companyuid IN ('COMP00153968', 'COMP00091748', 'COMP00177586', 'COMP00231427', 'COMP00077428', 'COMP00077490', 'COMP00255796')))) AND 
         (cp.tsg_communicationpreferencecategoryidname LIKE 'Category 4%') AND (cp.ccx_status = 803080000) 
         Group By cp.tsg_communicationpreferencetypeidname 
ORDER BY WebCommsPrefType 

Mais cela ne renvoie que les en-têtes sans résultat. Je pense que c'est peut-être le lien entre les tables principales et la table de sous-requête mais j'ai du mal à voir comment obtenir le compte exactement comme dans la requête externe sans avoir exactement le même code que chaque contact peut avoir plusieurs types.

Répondre

1

A jeté un autre coup d'oeil à ma question ce matin quand je n'étais pas si fatigué et la réponse est si simple. Il me manque la partie .value de l'expression et je n'ai pas eu besoin d'essayer de trouver la réponse parfaite dans mon code SQL. La réponse simple et facile est de faire le calcul du pourcentage dans le corps du rapport dans SSRS en utilisant l'expression:

=Fields!WebCommsPrefContact.Value/ReportItems!WebCommsPrefContact1.Value 

, puis formatez la zone de texte à pourcentage.