[Résolu] Order By et Union

Order By et Union [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 27-06-2008 à 12:30:00    

Bonjour,
 
Tout d'abord je sais qu'il est impossible d'avoir plusieurs Order BY dans chaque Union sur des Select d'une table temporaire (Donc pas possible d'avoir une vue)
 
Donc voici quand même ma requete (qui ne fonctionne pas car j'ai 3 Order BY)
SGBD : SQL Server 2005
 
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat
FROM #n
WHERE Etat='Final' AND Type='Exact'
ORDER BY ID_LCN
UNION (
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat
FROM #n
WHERE Etat='Final' AND Type='SUP'
ORDER BY nbJours
)
UNION (
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat
FROM #n
WHERE Etat='Final' AND Type='INF'
ORDER BY nbJours DESC
)
 
J'explique ce que je voudrais obtenir :  
Dans un premier temps tous les records dont le Type est "Exact" trié par ID_LCN
Puis tous les records dont le type est "SUP" trié par nbJours croissants
Enfin les records dont le type set "INF" trié par nbJours décroissants
 
Comment puis-je faire ?
 
Merci


Message édité par antac le 30-06-2008 à 11:11:26
Reply

Marsh Posté le 27-06-2008 à 12:30:00   

Reply

Marsh Posté le 29-06-2008 à 11:29:29    

oui tu peux.  
 
tu peux écrire ta query comme ceci.  
 
SELECT *
FROM
(
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat  
FROM #n  
WHERE Etat='Final' AND Type='Exact'  
UNION  
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat  
FROM #n  
WHERE Etat='Final' AND Type='SUP'  
UNION  
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat  
FROM #n  
WHERE Etat='Final' AND Type='INF'  
)
ORDER BY <order by clause>  


Message édité par moi23372 le 29-06-2008 à 11:30:53
Reply

Marsh Posté le 30-06-2008 à 11:11:04    

En fait, j'ai trouvé une autre solution. J'ai crée une nouvelle colonne Ratio dans ma table temporaire :  
 
A000 : pour les périodes exactes
BXXX (ou X correspond à un ratio Nombre de jours dispo/Nombre de jour totals)
CXXX(ou X correspond à un ratio Nombre de jour totals/Nombre de jours dispo) et je fais un order by sur Ratio à la fin

Reply

Marsh Posté le 01-07-2008 à 17:26:22    

si tu veux que le UNION conserve l'ordre des sous-requêtes, fait un UNION ALL
 
ceci dit, le fonctionnement n'est pas prévisible. ça peut marcher un jour et ne plus marcher le lendemain. à priori ça devrait marcher tout le temps, puisque le ALL vire le traîtement qui provoque la réorganisation des données (même effet de bord que le GROUP BY)


Message édité par MagicBuzz le 01-07-2008 à 17:27:31
Reply

Marsh Posté le 01-07-2008 à 17:30:06    

et sinon...
 
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat, 1 lvl, ID_LCN ordby  
FROM #n  
WHERE Etat='Final' AND Type='Exact'  
UNION all
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat, 2 lvl, nbjours ordby  
FROM #n  
WHERE Etat='Final' AND Type='SUP'  
UNION  
SELECT ID_OFR_MIN, ID_LCN, DateDeb, DateFin, Batiment, Niveau,Place, Locataire, nbJours, Type, Etat, 3 lvl, -nbjours ordby  
FROM #n  
WHERE Etat='Final' AND Type='INF'  
ORDER BY lvl, ordby  
 
et roule ma poule
 
intérêt : c'est 100% standard, et ça utilise pas d'exploit, et ça ne surcharge pour ainsi dire pas le moteur contrairement à ta tambouille ;) (qui fait d'ailleurs la même chose, mais avec des traîtements de chaîne inutiles)


Message édité par MagicBuzz le 01-07-2008 à 17:31:42
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed