Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 29/11/2011, 16h54   #1
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 119
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : décembre 2008
Messages : 119
Points : 35
Points : 35
Par défaut Requête avec rupture

Bonne rencontre,

J’ai un souci avec une requête SQL que je ne sais pas comment construire.
Imaginons que ma table est comme ceci (IDTable, maDate, champ2, FKTable)

Exemple données :

1, maDate 1,maValeur2,null
2, maDate2,maValeur4,null
3, maDate3,maValeur6,1
4, maDate4,maValeur8,null
5, maDate5,maValeur10,null
6, maDate6,maValeur12,2

Je souhaiterais avoir les enregistrements classé par maDate mais quand j’ai un enregistrement fils, je le voudrais en dessous du père.

Résultat souhaité :

1, maDate 1,maValeur2,null
3, maDate3,maValeur6,1
2, maDate2,maValeur4,null
6, maDate6,maValeur12,2
4, maDate4,maValeur8,null
5, maDate5,maValeur10,null

J’avoue n’avoir aucune idée de comment faire…

Quelqu’un pourrait m’aiguiller ?

Le SGBD est MS-SQL 2008

D’avance, merci.
Raphaël.
Raphael1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 17h45   #2
Candidat au titre de Membre du Club
 
Chef de projet NTIC
Inscription : avril 2005
Messages : 9
Détails du profil
Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : avril 2005
Messages : 9
Points : 12
Points : 12
Bonjour

Dans ton cas a priori vu que tu a une notion pere<->fils, tu peux utiliser les CTE : http://sqlpro.developpez.com/cours/s...te-recursives/

Une piste vite fait, ton ensemble de base pourra éventuellement être comme suit:

Code :
1
2
3
4
5
6
7
8
9
WITH tree ( root_id, parent_id,  level, IDTable, maDate, champ2, FKTable)  AS 
(
--Ensemble de base:pas de parent
SELECT IDTable AS root_id,NULL AS parent_id, 1 AS level, IDTable, maDate, champ2, FKTable FROM matable WHERE FKTable IS NULL
UNION ALL
--Ensemble sur lequel se fait la récursion
SELECT tree.root_id, m.FKTable AS parent_id, tree.level +1, m.IDTable, m.maDate, m.champ2, FKTable FROM matable m
INNER JOIN tree t ON t.IDTable = matable.parentid 
);
Code :
SELECT * FROM tree ORDER BY maDate,root_id,parent_id, level
pour les colonnes
  • root_id: pour savoir quel est l’élément racine si tu a plusieurs niveaux de recursion
  • level: pour connaitre le niveau de ta recursion
  • parent_id:pour ordonner si tu as plusieurs sous niveau pour un meme enfant ?

ca te permettra d'ordonner par date, puis par éléments racines/parents et niveau pour que ce soit correctement ordonné comme tu le veut.

C'est juste pour te donner une idée, y a des trous dans la raquette dans ce que je te dis.
Berni45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 08h42   #3
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 119
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : décembre 2008
Messages : 119
Points : 35
Points : 35
Merci à toi !

Je ne suis pas encore arrivé aux résultats souhaité mais je vais y arriver.
Raphael1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 09h05   #4
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 119
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : décembre 2008
Messages : 119
Points : 35
Points : 35
Code :
1
2
3
4
5
6
7
8
9
10
WITH tree ( root_id, parent_id,  level, IDTable, maDate, champ2, FKTable)  AS 
(
--Ensemble de base:pas de parent
SELECT IDTable AS root_id,NULL AS parent_id, 1 AS level, IDTable, maDate, champ2, FKTable FROM Table_tree WHERE FKTable IS NULL
UNION ALL
--Ensemble sur lequel se fait la récursion
SELECT root_id, m.FKTable AS parent_id, t.level +1, m.IDTable, m.maDate, m.champ2, m.FKTable FROM Table_tree m
INNER JOIN tree t ON t.IDTable = m.FKTable)
 
SELECT * FROM tree ORDER BY root_id,parent_id, level,maDate
Code :
1
2
3
4
5
6
7
8
9
root_id	parent_id	level	IDTable	maDate	       champ2	      FKTable
1	NULL	        1	1	2011-01-01	test 1    	NULL
1	1	        2	3	2011-01-01	test 3    	1
1	1	        2	6	2011-01-01	test 6    	1
1	1	        2	7	2011-01-02	test 7    	1
2	NULL	        1	2	2011-03-04	test 2    	NULL
2	2	        2	8	2011-03-04	test 8    	2
2	2	        2	5	2011-11-01	test 5    	2
4	NULL 	        1	4	2011-07-09	test 4    	NULL
Maintenant, je dois tester ça sur ma bonne table.
Raphael1980 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 00h33.


 
 
 
 
Partenaires

Hébergement Web