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

Langage SQL Discussion :

Demande d'aide pour réalisation d'une requête SQL


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut Demande d'aide pour réalisation d'une requête SQL
    Bonjour,

    je dois trier les lignes d'une table PROG_PROD regroupés et triés selon différents critères:
    - D'abord, les éléments dont le numéro de séquence est différent de 0, triés par N° de séquence, N° de programme et N° de produit
    - Puis les éléments dont la numéro de séquence est égale à 0 et dont la priorité du programme est 1 ou 2. Ces éléments doivent être triés selon le N° de priorité, le N° de programme et le N° de produit
    - Enfin les éléments dont le type est 'VKH'. Ces éléments doivent être triés selon le N° de programme et le N° de produit

    Ma requête est présentée ci-dessous.
    J'ai effectué 3 requêtes que j'ai associé avec la clause UNION.

    Pour trier l'ensemble, j'ai affecté une valeur [ORDERED_GRP] à chaque requête et j'ai utilisé la clause Rank pour trier chaque jeu de résultat.

    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
     
    SELECT	[ID],[TOOL],[N_PROG],[PROG_PRIO],[PROG_STATUS],[N_PRODUIT],[N_SEQU],[S_TYPE], 1 as ORDERED_GRP, rank() over (order by [N_SEQU], [N_PROG], [N_PRODUIT]) as rank
    FROM	PROG_PROD
    WHERE	[N_SEQU] <> 0
    UNION
    SELECT	[ID],[TOOL],[N_PROG],[PROG_PRIO],[PROG_STATUS],[N_PRODUIT],[N_SEQU],[S_TYPE], 2 as ORDERED_GRP, rank() over (order by [PROG_PRIO],[N_PROG],[N_PRODUIT]) as rank
    FROM	PROG_PROD
    WHERE	[N_SEQU] = 0
    AND		[PROG_PRIO] IN (1,2)
    UNION
    SELECT	[ID],[TOOL],[N_PROG],[PROG_PRIO],[PROG_STATUS],[N_PRODUIT],[N_SEQU],[S_TYPE], 3 as ORDERED_GRP, rank() over (order by [N_PROG],[N_PRODUIT]) as rank
    FROM	PROG_PROD
    WHERE	[N_SEQU] = 0
    AND		[S_TYPE] = 'VKH'
    AND		[PROG_PRIO] NOT IN (1,2)

    Je ne suis pas sûr que la manière dont j'ai procédé soit la meilleure solution pour ce genre de requête.
    Comment puis-je optimiser cette requête ?

    Merci d'avance,
    Etienne

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Qu'est ce que ça donne avec des CASE :
    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
    SELECT [ID],[TOOL],[N_PROG],[PROG_PRIO],[PROG_STATUS],[N_PRODUIT],[N_SEQU],[S_TYPE], 
           case when n_sequ <> 0 
                then 1
                when n_sequ = 0 and prog_prio in (1,2)
                then 2
                when n_sequ = 0 and prog_prio not in (1,2) and s_type = 'VKH'
                then 3
            end AS ORDERED_GRP
      FROM PROG_PROD
     order by case when n_sequ <> 0 
                   then 1
                   when n_sequ = 0 and prog_prio in (1,2)
                   then 2
                   when n_sequ = 0 and prog_prio not in (1,2) and s_type = 'VKH'
                   then 3
                   else 4
               end,
              case when n_sequ <> 0 then n_sequ end,
              case when n_sequ = 0 and prog_prio in (1,2) then PROG_PRIO end,
              N_PROG, N_PRODUIT
    Le problème de votre requête est qu'il manque un ORDER BY, les résultats ne sont donc pas triés même s'ils peuvent sembler l'être.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Bonjour,

    je vous remercie pour la réponse.
    J'ai oublié de mettre l'order by dans ma requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORDER BY ORDERED_GRP, rank
    Cela donne

    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
     
    SELECT	[ID],[TOOL],[N_PROG],[PROG_PRIO],[PROG_STATUS],[N_PRODUIT],[N_SEQU],[S_TYPE], 1 AS ORDERED_GRP, rank() over (ORDER BY [N_SEQU], [N_PROG], [N_PRODUIT]) AS rank
    FROM	PROG_PROD
    WHERE	[N_SEQU] <> 0
    UNION
    SELECT	[ID],[TOOL],[N_PROG],[PROG_PRIO],[PROG_STATUS],[N_PRODUIT],[N_SEQU],[S_TYPE], 2 AS ORDERED_GRP, rank() over (ORDER BY [PROG_PRIO],[N_PROG],[N_PRODUIT]) AS rank
    FROM	PROG_PROD
    WHERE	[N_SEQU] = 0
    AND		[PROG_PRIO] IN (1,2)
    UNION
    SELECT	[ID],[TOOL],[N_PROG],[PROG_PRIO],[PROG_STATUS],[N_PRODUIT],[N_SEQU],[S_TYPE], 3 AS ORDERED_GRP, rank() over (ORDER BY [N_PROG],[N_PRODUIT]) AS rank
    FROM	PROG_PROD
    WHERE	[N_SEQU] = 0
    AND		[S_TYPE] = 'VKH'
    AND		[PROG_PRIO] NOT IN (1,2)
    ORDER BY ORDERED_GRP, rank
    Je vais essayer votre requête et je vous dis quoi.
    Etienne

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Bonjour,

    j'ai essayé avec votre requête et ça marche parfaitement aussi.
    Est-ce que votre requête est plus optimale qu'avec l'utilisation de rank ?

    Merci d'avance,
    Etienne

Discussions similaires

  1. Aide pour optimisation d'une requête
    Par yoyodemars dans le forum Développement
    Réponses: 13
    Dernier message: 09/11/2012, 11h59
  2. Aide pour Simplifier/optimiser une requête SQL
    Par bubu06 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/05/2012, 18h25
  3. [MySQL] Demande d'aide pour réaliser un script
    Par maxwell398 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 07/01/2010, 20h05
  4. Aide pour établissement d'une requête
    Par Virgile59 dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2006, 18h55

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