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:
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.
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.