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 :

Requête avec Exists et Not Exists [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 38
    Par défaut Requête avec Exists et Not Exists
    Bonjour,

    Je travaille sur une requête de calcul sur une seule table dont le but est de calculer une somme pour une période définie.

    Je cherche une somme des cartes non utilisées l'année dernière mais utilisées les 6 mois avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select sum(Mtt) 
    from Table p with (nolock) 
    where p.date < '2019-01-01' 
    and not exists (select 1 from Table p2 with (nolock)  
         where (p2.date >='2018-01-01' and p2.date < '2019-01-01')
         and p.carte = p2.carte)
    and exists (select 1 from Table p1 with (nolock)  
         where (p1.date >='2017-07-01' and p1.date < '2018-01-01')
         and p.carte= p1.carte)
    * carte est une clé primaire

    La requête est hyper longue à s’exécuter.
    Est-elle correcte ?

    Merci pour vos retours
    Séverine

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    C'est quoi cette utilisation stupide des WITH (NOLOCK) ?

    Avez vous un index sur table(carte, date) ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 93
    Par défaut
    Salut,

    Je ne connais pas ton modèle de données, mais une requête dans ce style ferait peut-être le job :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT SUM(TotalParCarte)
    FROM (
    SELECT SUM(p.Mtt) as TotalParCarte
    FROM Table p
    WHERE p.Date < '2019-01-01' 
    HAVING MAX(p.Date) BETWEEN '2017-07-01' AND '2017-12-31') as T
    La sous-requête ramène le total par carte dont la dernière date d'utilisation est dans les 6 derniers mois avant le début de l'année. Ensuite on somme le tout pour ne plus avoir le détail par carte.

  4. #4
    Membre actif
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 38
    Par défaut
    Désolée Jaco67 mais la requête ne ramène rien.

    J'ai testé aussi ainsi et ça me semble bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select sum(Mtt) 
    from Table p with (nolock) 
    where p.date < '2019-01-01' 
    and p.carte in  (select p2.carte from Table p2 with (nolock)  
         where p2.date >='2018-01-01' and p2.date < '2019-01-01')
    and p.carte in  (select p1.carte from Table p1 with (nolock)  
         where p1.date >='2017-07-01' and p1.date < '2018-01-01')
    Pour les index, je n'ai pas la main.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Citation Envoyé par Jaco67 Voir le message
    mais une requête dans ce style ferait peut-être le job :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT SUM(TotalParCarte)
    FROM (
    SELECT SUM(p.Mtt) as TotalParCarte
    FROM Table p
    WHERE p.Date < '2019-01-01' 
    HAVING MAX(p.Date) BETWEEN '2017-07-01' AND '2017-12-31') as T


    Oui, l'idée est bonne, je pense qu'il manque juste un GROUP BY Carte dans la sous requête.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 93
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    je pense qu'il manque juste un GROUP BY Carte dans la sous requête.
    Haha oui, je l'avais quand j'ai testé sous SSMS mais j'ai dû mal recopier mon test ^^

  7. #7
    Membre actif
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 38
    Par défaut
    Bravo
    Ça marche

    Merci pour tout

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

Discussions similaires

  1. Requête avec EXISTS
    Par DeWaRs dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/09/2012, 11h01
  2. [AC-2000] Requête avec EXISTS
    Par B-CAB dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/07/2010, 12h05
  3. Optimisation de requêtes avec EXISTS
    Par Asfaloth dans le forum Requêtes
    Réponses: 1
    Dernier message: 19/06/2010, 09h16
  4. Sous-requêtes avec IN et NOT IN
    Par angebe dans le forum SQL
    Réponses: 6
    Dernier message: 28/09/2007, 12h59
  5. Requète avec NOT EXISTS
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 16h20

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