Question

Je suis nouveau sur SQL Server Reporting Services et je me demandais quelle était la meilleure façon de procéder comme suit :

  • Requête pour obtenir une liste des identifiants populaires
  • Sous-requête sur chaque élément pour obtenir les propriétés d'une autre table

Idéalement, les colonnes du rapport final ressembleraient à ceci :

[ID] [property1] [property2] [SELECT COUNT(*)
                              FROM AnotherTable 
                              WHERE ForeignID=ID]

Il existe peut-être des moyens de construire une requête SQL géante pour faire tout cela en une seule fois, mais je préférerais la compartimenter.L'approche recommandée consiste-t-elle à écrire une fonction VB pour effectuer la sous-requête pour chaque ligne ?Merci pour toute aide.

Était-ce utile?

La solution

Je recommanderais d'utiliser un Sous-rapport.Vous placeriez le sous-rapport dans une cellule du tableau.

Autres conseils

Selon l'apparence souhaitée du résultat, un sous-rapport peut faire l'affaire, ou vous pouvez regrouper sur ID, propriété1, propriété2 et afficher les éléments de votre autre table en tant qu'éléments de détail (en supposant que vous souhaitiez afficher plus que simplement le nombre).

Quelque chose comme

select t1.ID, t1.property1, t1.property2, t2.somecol, t2.someothercol
from table t1 left join anothertable t2 on t1.ID = t2.ID

@Carlton Jenke Je pense que vous trouverez une jointure externe plus performante que la sous-requête corrélée dans l'exemple que vous avez donné.N'oubliez pas que la sous-requête doit être exécutée pour chaque ligne.

La méthode la plus simple est la suivante :

select *,
 (select count(*) from tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from tbl1 t1

voici une version réalisable (en utilisant des variables de table) :

declare @tbl1 table
(
 tbl1ID int,
 prop1 varchar(1),
 prop2 varchar(2)
)

declare @tbl2 table
(
 tbl2ID int,
 tbl1ID int
)

select *,
 (select count(*) from @tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from @tbl1 t1

Évidemment, ce n'est qu'un exemple brut - des règles standard s'appliquent comme ne pas sélectionner *, etc...


MISE À JOUR du 21 août 2008 à 21h27 :
@AlexCuse - Oui, tout à fait d'accord sur la performance.

J'ai commencé à l'écrire avec la jointure externe, mais j'ai ensuite vu dans son exemple de sortie le nombre et j'ai pensé que c'était ce qu'il voulait, et le nombre ne reviendrait pas correctement si les tables étaient jointes en externe.Sans oublier que les jointures peuvent entraîner la multiplication de vos enregistrements (1 entrée de tbl1 qui correspond à 2 entrées dans tbl2 = 2 retours), ce qui peut être involontaire.

Je suppose donc que cela se résume vraiment aux détails de ce que votre requête doit renvoyer.


MISE À JOUR du 21 août 2008 à 22h07 :
Pour répondre aux autres parties de votre question : une fonction VB est-elle la solution ?Non.Absolument pas.Pas pour quelque chose d'aussi simple.

Les fonctions sont très mauvaises en termes de performances, chaque ligne de l'ensemble de retour exécute la fonction.

Si vous souhaitez « compartimenter » les différentes parties de la requête, vous devez l’aborder davantage comme une procédure stockée.Créez une table temporaire, effectuez une partie de la requête et insérez les résultats dans la table, puis effectuez toutes les autres requêtes dont vous avez besoin et mettez à jour la table temporaire d'origine (ou insérez-la dans davantage de tables temporaires).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top