|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 131 ![]() |
Bonjour,
Je me demandais si il était possible de faire une requête récursive avec des agrégats. Je m'explique; prenons les tables suivantes : Code :
Code :
NB : Les lignes présentes dans la table de référence CategoryAsset ne font référence uniquement au enregistrements de Category ayant IsFinal=1 (Marqueur indiquant que la catégorie n'est parente d'aucune catégorie) NB2 : Il faut que la la somme des assets pour une categorie soit la somme des sommes d'assets des sous catégories du niveau (n-1)... Merci d'avance et bonne journée à tous! |
||||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Il suffit de faire une CTE avant celle récursive qui calcule le COUNT du groupage minimal puis dans la CTE de l'additionner par récursivité.
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 |
![]() ![]() |
Il faut fournir quelques données avec vos tables !
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#4 | ||
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 131 ![]() |
Voici un jeu de données pour les tables (énonncées dans mon post initial)
Code :
Champs : Category.Id, Category.Name, Level, AssetCount 1, 'Name1', 0, 4 2, 'Name2', 0, 2 11, 'Name11', 1, 1 12, 'Name12', 1, 3 111, 'Name111', 2, 1 22, 'Name22', 1, 2 NB : Je travaille avec SQL SERVER 2005 |
||
|
|
00
|
|
|
#5 | |||
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 131 ![]() |
Citation:
Code :
GROUP BY, HAVING, or aggregate functions are not allowed in the recursive part of a recursive common table expression 'Categories'. Ce qui est normal étant donnée que la documentation MSDN spécifie bien que le GROUP BY n'est pas autorisé dans la partie récursive... Mais sans faire de GROUP BY ne ne vois pas comment on peut faire la somme des assets. Toujours pas de solution pour le moment Je reste ouvert à toutes propositions |
|||
|
|
00
|
|
|
#6 | |||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Il fallait suivre ce que vous a conseillé SQLPro :
Citation:
Code :
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|||
|
00
|
|
|
#7 |
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 131 ![]() |
Bonjour Elsuket,
Merci de ta réponse. Ta requête est très intéressante et semble se rapprocher de ce que je cherche à faire. Si j'ai bien compris : - Le premier SELECT (ASSET_COUNT) fait la somme des actifs par catégorie. NB :Sachant que seules les catégories n'ayant pas d'enfant ont un AssetCount > 0 (Ceci à cause du fait que seulement ces catégories sont présentes dans la table CategoryAsset). - Le deuxième SELECT (CTE) renvoie les catégories du niveau de base avec la somme des actifs (calculé dans la première requête) - Le troisième SELECT (Membre récursif) nous fait l'addition de la somme des actifs du niveau n-1 avec celui du niveau n. Le problème est que, de cette façon, mes niveaux de bases aurons toujours un AssetCount = 0... Existe-il un moyen de faire la récursivité dans l'autre sens (depuis les niveau finaux vers les niveaux parents de base)? |
|
|
00
|
|
|
#8 | |||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
Citation:
On appelle ce SELECT l'ancre (anchor) de l'expression de table commune. Citation:
Citation:
Citation:
Je vous laisse chercher un peu ? @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|||||
|
00
|
|
|
#9 | ||
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 131 ![]() |
Je pense avancer dans la résolution de mon problème.
La requête suivante me donne bien le bon nombre d'actifs par catégories : Code :
Je n'ai plus non plus les catégories ne contenant aucun actif mais ceci n'est pas gênant non plus. Si quelqu'un voit quelque chose à redire ou une meilleure façon de faire, je suis preneur Merci encore pour votre participation
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com