IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Trier mes résultats en fonction de deux champs, mais différemment en fonction du cas [2014]


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Analyste - Programmeur
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste - Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Trier mes résultats en fonction de deux champs, mais différemment en fonction du cas
    Bonjour à tous,

    j'ai un problème assez spécifique pour réaliser un tri "complexe".

    J'ai une table : HISTORIQUE, dedans je veux trier en fonction de 2 champs : NUMERO_RECEPTION et RECEPTION_PARENTE
    mes lignes d'historiques contiennent deux types de données:
    - des lignes "mères" : NUMERO_RECEPTION ok, RECEPTION_PARENTE à NULL
    - des lignes "filles" : NUMERO_RECEPTION ok (et forcément supérieur à RECEPTION_PARENTE), RECEPTION_PARENTE ok

    Je souhaite ranger mes résultats de telle sorte qu'on est 1 ligne mère et ses lignes filles etc.
    un cas concret :
    NUMERO_RECEPTION | RECEPTION_PARENTE
    4500 | NULL
    5800 | 4500
    5900 | 4500
    4600 | NULL
    4700 | NULL
    5400 | 4700
    6600 | 4700

    Je m'en sors pas.. Merci d'avance

  2. #2
    Candidat au Club
    Homme Profil pro
    Analyste - Programmeur
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste - Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Précision
    on peut avoir aussi :

    NUMERO_RECEPTION | RECEPTION_PARENTE
    4500 | NULL

    4550 | 4500
    4560 | 4500

    5800 | 4500
    5900 | 4500
    4600 | NULL
    4700 | NULL
    5400 | 4700
    6600 | 4700

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY COALESCE(reception_parente, numero_reception), numero_reception
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Candidat au Club
    Homme Profil pro
    Analyste - Programmeur
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste - Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Super ! je connaissais pas COALESCE... j'ai juste mis ORDER BY COALESCE(reception_parente, numero_reception), reception_parente //numero_reception
    pour avoir mes lignes "mères" avant les lignes "filles", c'est exactement ce que je cherchais merci beaucoup !

  5. #5
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Je suis désolé de revenir sur cette question.
    En effet, la solution proposé par al1_24 marche très bien pour une structure hiérarchique à deux niveaux Père/Fils.
    mais qu'en est il lorsque la structure hiérarchique possède plusieurs niveaux ? La structure à 2 niveaux est cas particulier du problème.

    Selon le principe "Qui peut le plus peut le moins", je vous propose cette autre solution, ci-dessous, plus générique, valable quelle que soit la profondeur de la structure hiérarchique.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    WITH CTE
    AS ( SELECT NUMERO_RECEPTION, RECEPTION_PARENTE,          
    		 CAST(ROW_NUMBER() OVER(PARTITION BY RECEPTION_PARENTE ORDER BY NUMERO_RECEPTION) AS VARCHAR(MAX)) AS Chemin 
    		FROM dbo.MaTable
    		WHERE RECEPTION_PARENTE IS NULL 
    		UNION ALL
    		SELECT T.NUMERO_RECEPTION, T.RECEPTION_PARENTE, 
    		 P.Chemin  +'/' + CAST(ROW_NUMBER() OVER(PARTITION BY T.RECEPTION_PARENTE ORDER BY T.NUMERO_RECEPTION) AS VARCHAR(MAX))
    		FROM dbo.MaTable T  
    		INNER JOIN CTE P    -- P  Comme Parent 
    		  ON T.RECEPTION_PARENTE = P.NUMERO_RECEPTION 
    		WHERE T.RECEPTION_PARENTE IS NOT NULL )
    SELECT CTE.NUMERO_RECEPTION, CTE.RECEPTION_PARENTE, CTE.Chemin   
    FROM CTE
    ORDER BY CTE.Chemin


    Résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NUMERO_RECEPTION	RECEPTION_PARENTE	Chemin
    4500	NULL	1
    4550	4500	1/1
    4560	4500	1/2
    5800	4500	1/3
    5900	4500	1/4
    4600	NULL	2
    4700	NULL	3
    5400	4700	3/1
    6600	4700	3/2
    PS : On peut peut être faire mieux (?)

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonctions sur deux champs distincts
    Par Jordan62 dans le forum jQuery
    Réponses: 4
    Dernier message: 25/02/2014, 10h38
  2. Trier mes résultats
    Par VivoJean44 dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2012, 17h59
  3. Réponses: 4
    Dernier message: 09/12/2010, 12h28
  4. résultat de requête avec deux champs issus du même champ initial
    Par Macrounet dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/08/2010, 17h38
  5. [AC-2000] msgbox d'erreur en fonction de deux champs
    Par polo31 dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/07/2009, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo