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

Développement SQL Server Discussion :

Tri complexe trop complexe pour moi


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Par défaut Tri complexe trop complexe pour moi
    Bonjour,


    Je cherche à trier le résultat de cette requête (simplifiée) :

    Nombres d'articles par famille et sous-famille avec des totaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select FAM, SOUSFAM, Count(*),
    grouping(FAM), grouping(SOUSFAM) from ARTICLES
    Group by FAM, SOUSFAM with ROLLUP
    le but est d'avoir la liste triée par nombre décroissant d'articles mais en gardant l'homogénéité des familles. Je m'explique avec un petit exemple :


    GRP1 = grouping(FAM)
    GRP2 = grouping(SFAM)


    Je ne sais pas si c'est possible ?? je n'arrive pas à trouver la logique. Avez vous une piste ?
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si vous êtes au moins en SQL Server 2005 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    WITH MonResultat (FAM, SFAM, Nb, G1, G2) AS
    (
    select 'A', 'A',  5, 0, 0 union all
    select 'A', 'B',  9, 0, 0 union all
    select 'A', 'C',  3, 0, 0 union all
    select 'A', '' , 17, 0, 1 union all
    select 'B', 'A',  2, 0, 0 union all
    select 'B', 'B',  5, 0, 0 union all
    select 'B', 'C', 16, 0, 0 union all
    select 'B', '' , 23, 0, 1 union all
    select '' , '' , 40, 1, 1
    )
      select *
        from MonResultat
    order by max(case when g2 = 1 and g1 = 0 then Nb end) over(partition by fam) desc,
            case when g2 = 1 and g1 = 0 then 0 else 1 end desc,
            Nb desc;
     
    FAM  SFAM Nb          G1          G2
    ---- ---- ----------- ----------- -----------
    B    C    16          0           0
    B    B    5           0           0
    B    A    2           0           0
    B         23          0           1
    A    B    9           0           0
    A    A    5           0           0
    A    C    3           0           0
    A         17          0           1
              40          1           1

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Par défaut
    Nickel Waldar ! ca marche super ...

    Par contre j'ai rien compris à l'order by !

    Peux tu m'expliquer dans les grandes lignes stp ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il suffit de les mettre dans le SELECT, vous comprendez mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
      select *,
             max(case when g2 = 1 and g1 = 0 then Nb end) over(partition by fam) o1,
             case when g2 = 1 and g1 = 0 then 0 else 1 end o2
        from MonResultat
    order by max(case when g2 = 1 and g1 = 0 then Nb end) over(partition by fam) desc,
            case when g2 = 1 and g1 = 0 then 0 else 1 end desc,
            Nb desc;
     
    FAM  SFAM Nb          G1          G2          o1          o2
    ---- ---- ----------- ----------- ----------- ----------- -----------
    B    C    16          0           0           23          1
    B    B    5           0           0           23          1
    B    A    2           0           0           23          1
    B         23          0           1           23          0
    A    B    9           0           0           17          1
    A    A    5           0           0           17          1
    A    C    3           0           0           17          1
    A         17          0           1           17          0
              40          1           1           NULL        1
    o1 est une fonction de fenêtrage qui propage la valeur du total de la famille à tous les éléments de la famille.
    o2 me permet de trier les valeurs non regroupées avant les totaux.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Par défaut
    pfiouuu ...

    respect ! je vais m'empresser de réutiliser tout ca

    Merci encore

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

Discussions similaires

  1. Curseur et trigger complexe (du moins pour moi)
    Par Zisiio dans le forum PL/SQL
    Réponses: 1
    Dernier message: 21/12/2012, 14h20
  2. Requete (trop ) compliquée ( pour moi )
    Par hisy dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 16/06/2006, 13h16
  3. Réponses: 7
    Dernier message: 13/01/2006, 17h02
  4. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 15h17

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