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 :

Optimisation requête comportant plusieurs Count


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Optimisation requête comportant plusieurs Count
    Bonjour,

    Je cherche à optimiser la requête suivante (bcp trop longue à s'exécuter) :

    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
    30
    31
    32
    SELECT DISTINCT DATEPART(Yy,_APPEL.Date) AS ANNEE,
     
    (select COUNT(*) from APPEL INNER JOIN
    OBJET ON
    APPEL.C_OBJET = OBJET.C_OBJET
    Where APPEL.C_NATURE='SAV'
    AND C_REF LIKE '%15D%'
    AND DATEPART(Yy,APPEL.Date)=DATEPART(Yy,_APPEL.Date)) AS Prod1,
     
    (select COUNT(*) from APPEL INNER JOIN
    OBJET ON
    APPEL.C_OBJET = OBJET.C_OBJET
    Where APPEL.C_NATURE='SAV'
    AND ( C_REF LIKE '%20D%' AND C_REF NOT LIKE '%XI2%')
    AND DATEPART(Yy,APPEL.Date)=DATEPART(Yy,_APPEL.Date)) AS Prod2,
     
    (select COUNT(*) from APPEL INNER JOIN
    OBJET ON
    APPEL.C_OBJET = OBJET.C_OBJET
    Where APPEL.C_NATURE='SAV'
    AND ( C_REF LIKE '%XI2%')
    AND DATEPART(Yy,APPEL.Date)=DATEPART(Yy,_APPEL.Date)) AS Prod3,
     
    (select COUNT(*) from APPEL INNER JOIN
    OBJET ON
    APPEL.C_OBJET = OBJET.C_OBJET
    Where APPEL.C_NATURE='SAV'
    AND C_REF LIKE '%4102%'
    AND DATEPART(Yy,APPEL.Date)=DATEPART(Yy,_APPEL.Date)) AS Prod4
     
    FROM APPEL _APPEL
    ORDER BY ANNEE

    En gros, je cherche à obtenir le nombre de produit (pour les 4 références) pour chaque année. Il est indispensable de ne faire qu'une seule requête.
    Si vous avez des idées..

    Merci!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Es tu obligé de faire un "LIKE '%4102%'" ?
    En effet, si tu utilises un joker en début, tu ne pourras pas bénéficier des indexs...
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 949
    Points : 5 848
    Points
    5 848
    Par défaut
    La requête doit pouvoir se simplifier comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DATEPART(Yy,_APPEL.Date) AS ANNEE,
           sum(case when C_REF LIKE '%15D%' then 1 end) as Prod1,
           sum(case when C_REF LIKE '%20D%' AND C_REF NOT LIKE '%XI2%' then 1 end) as Prod2,
           sum(case when C_REF LIKE '%XI2%' then 1 end) as Prod3,
           sum(case when C_REF LIKE '%4102%' then 1 end) as Prod4
      FROM APPEL _APPEL
      JOIN OBJET ON _APPEL.C_OBJET = OBJET.C_OBJET
     Where _APPEL.C_NATURE='SAV'
     group by DATEPART(Yy,_APPEL.Date)
     ORDER BY ANNEE

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Oui, c'est le seul moyen que j'ai pour récupérer la bonne référence de produit...

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    En effet ça fonctionne parfaitement !
    Merci beaucoup.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    La requête doit pouvoir se simplifier comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DATEPART(Yy,_APPEL.Date) AS ANNEE,
           sum(case when C_REF LIKE '%15D%' then 1 end) as Prod1,
           sum(case when C_REF LIKE '%20D%' AND C_REF NOT LIKE '%XI2%' then 1 end) as Prod2,
           sum(case when C_REF LIKE '%XI2%' then 1 end) as Prod3,
           sum(case when C_REF LIKE '%4102%' then 1 end) as Prod4
      FROM APPEL _APPEL
      JOIN OBJET ON _APPEL.C_OBJET = OBJET.C_OBJET
     Where _APPEL.C_NATURE='SAV'
     group by DATEPART(Yy,_APPEL.Date)
     ORDER BY ANNEE
    Le sum (case.....)
    est moins coûteux que le count?

    Merci

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

Discussions similaires

  1. [2008R2] Probléme avec une Requête select plusieurs count avec le regroupement ?
    Par hamza_azerty dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/09/2014, 22h54
  2. Optimiser Requêtes entre plusieurs tables
    Par Korben-Dallas dans le forum Débuter
    Réponses: 6
    Dernier message: 24/06/2010, 18h34
  3. [MySQL] Optimisation requête avec SELECT COUNT
    Par przvl dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/10/2008, 15h27
  4. faire plusieur count dans une même requète
    Par bossLINDROS dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/04/2008, 10h04
  5. optimisation de requête avec plusieurs union
    Par Smix007 dans le forum SQL
    Réponses: 11
    Dernier message: 02/04/2008, 16h59

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