Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/12/2010, 17h27   #1
Invité de passage
 
Homme Colin Calvat
Développeur .NET
Inscription : février 2005
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Colin Calvat
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2005
Messages : 5
Points : 0
Points : 0
Envoyer un message via MSN à kalvados
Par défaut [MSSQL2005] Groupement récursif

Bonjour,

Pour un projet sur lequel je travaille actuellement je dois effectuer des calculs avant de regrouper les informations afin de générer des bilans.

Or dans certains cas le regroupement se fait sur des données hiérarchiques, et devrait donc être récursif.

Je m'explique :

Ma donnée de base, sur laquelle j'effectue les calculs et que je souhaite regrouper, et une DEMANDE.

(Je remplis une table temporaire avec les identifiants de DEMANDE et les calculs associés)

Cette DEMANDE est rattaché à un SITE, lui-même rattaché à une SEGMENTATION.

Cette segmentation (en l’occurrence un segmentation géographique), et hiérarchique, c'est-à-dire que chaque segmentation contient une référence vers sa segmentation mère (ID_PARENT).
De plus elle contient un champ de typage (TYPE_SEGMENTATION) permettant d'attribuer des types aux segmentations (Pays, Region, Departement).

Très logiquement, les SITE sont habituellement rattachés au niveau le plus bas soit dans cet exemple aux segmentations de type "Departement".

Mon problème est de regrouper mes données par type de segmentation.

Pas de souci pour grouper par segmentations de type "Departement" puisque mes SITE y sont directement rattachés, mais si je groupe sur un niveau supérieur (Region ou Pays), comment faire pour que les données des segmentations filles soient remontées et sommées dans mon resultat final ?

J'ai essayé en utilisant les CTE mais je ne suis arrivé à rien de concluant...


Merci d'avance pour votre aide !
kalvados est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 23/12/2010, 18h05   #2
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
Il nous faudrait la structure des tables concernées
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 18h17   #3
Invité de passage
 
Homme Colin Calvat
Développeur .NET
Inscription : février 2005
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Colin Calvat
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2005
Messages : 5
Points : 0
Points : 0
Envoyer un message via MSN à kalvados
Bonsoir Népomucène,

Est-ce que ceci fait l'affaire ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- ##TABLE_TEMP_CALCULS
ID_DEMANDE (int non NULL)
CALCUL1 (int)
CALCUL2 (decimal)
 
-- DEMANDE
ID_DEMANDE (int PK non NULL)
ID_SITE (int FK non NULL)
 
-- SITE
ID_SITE (int PK non NULL)
ID_SEGMENTATION (int FK non NULL)
 
-- SEGMENTATION
ID_SEGMENTATION (int PK non NULL)
ID_PARENT (int FK NULL)
TYPE_SEGMENTATION (int FK NULL)
kalvados est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 18h48   #4
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
Si les demandes sont sur des sites de type "département",
et qu'il faut pouvoir regrouper par régions, il faudrait avoir
un lien entre régions et département ; à savoir ce que tu disais dans :

Citation:
chaque segmentation contient une référence vers sa segmentation mère (ID_PARENT)
Il faut donc la structure de la table contenant le champ ID_PARENT
et on ne sera pas loin de la solution
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 23h09   #5
Invité de passage
 
Homme Colin Calvat
Développeur .NET
Inscription : février 2005
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Colin Calvat
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2005
Messages : 5
Points : 0
Points : 0
Envoyer un message via MSN à kalvados
En effet...

J'ai corrigé mon précédent post pour ajouter le champ manquant.
kalvados est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 12h26   #6
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
Bon alors la solution théorique pour présenter le tableau Pays/région/département est :
Code :
1
2
3
4
5
6
7
8
9
SELECT 
     P.TYPE_SEGMENTATION AS Pays,
     R.TYPE_SEGMENTATION AS Région,
     D.TYPE_SEGMENTATION AS Département
 
FROM 
     SEGMENTATION AS P INNER JOIN
     SEGMENTATION AS R ON P.ID_SEGMENTATION = R.ID_PARENT INNER JOIN
     SEGMENTATION AS D ON R.ID_SEGMENTATION = D.ID_PARENT
Du coup, on peut connecter ce bel ensemble à la table des demandes et faire par exemple la somme des calculs par départements :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
     P.TYPE_SEGMENTATION AS Pays,
     R.TYPE_SEGMENTATION AS Région,
     D.TYPE_SEGMENTATION AS Département,
     SUM(T.CALCUL1) AS TOTAL_1,
     SUM(T.CALCUL2) AS TOTAL_2
 
FROM 
     SEGMENTATION AS P INNER JOIN
     SEGMENTATION AS R ON P.ID_SEGMENTATION = R.ID_PARENT INNER JOIN
     SEGMENTATION AS D ON R.ID_SEGMENTATION = D.ID_PARENT INNER JOIN
     SITE AS S ON D.ID_SEGMENTATION = S.ID_SEGMENTATION INNER JOIN
     DEMANDE AS E ON S.ID_SITE= E.ID_SITE INNER JOIN
     TABLE_TEMP_CALCULS AS T ON T.ID_DEMANDE= E.ID_DEMANDE
 
GROUP BY
     P.TYPE_SEGMENTATION AS Pays,
     R.TYPE_SEGMENTATION AS Région,
     D.TYPE_SEGMENTATION AS Département
pour regrouper par région, on supprime le niveau département :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT 
     P.TYPE_SEGMENTATION AS Pays,
     R.TYPE_SEGMENTATION AS Région,
     SUM(T.CALCUL1) AS TOTAL_1,
     SUM(T.CALCUL2) AS TOTAL_2
 
FROM 
     SEGMENTATION AS P INNER JOIN
     SEGMENTATION AS R ON P.ID_SEGMENTATION = R.ID_PARENT INNER JOIN
     SEGMENTATION AS D ON R.ID_SEGMENTATION = D.ID_PARENT INNER JOIN
     SITE AS S ON D.ID_SEGMENTATION = S.ID_SEGMENTATION INNER JOIN
     DEMANDE AS E ON S.ID_SITE= E.ID_SITE INNER JOIN
     TABLE_TEMP_CALCULS AS T ON T.ID_DEMANDE= E.ID_DEMANDE
 
GROUP BY
     P.TYPE_SEGMENTATION AS Pays,
     R.TYPE_SEGMENTATION AS Région
pour regrouper par pays, on supprime le niveau région:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
     P.TYPE_SEGMENTATION AS Pays,
     SUM(T.CALCUL1) AS TOTAL_1,
     SUM(T.CALCUL2) AS TOTAL_2
 
FROM 
     SEGMENTATION AS P INNER JOIN
     SEGMENTATION AS R ON P.ID_SEGMENTATION = R.ID_PARENT INNER JOIN
     SEGMENTATION AS D ON R.ID_SEGMENTATION = D.ID_PARENT INNER JOIN
     SITE AS S ON D.ID_SEGMENTATION = S.ID_SEGMENTATION INNER JOIN
     DEMANDE AS E ON S.ID_SITE= E.ID_SITE INNER JOIN
     TABLE_TEMP_CALCULS AS T ON T.ID_DEMANDE= E.ID_DEMANDE
 
GROUP BY
     P.TYPE_SEGMENTATION AS Pays
Joyeux Noël
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h55.


 
 
 
 
Partenaires

Hébergement Web