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 :

BETWEEN dynamique dans la clause WHERE


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut BETWEEN dynamique dans la clause WHERE
    Bonjour,

    Je dois actuellement récupérer des données en fonction de champs représentant des dates (pas au format date).
    J'ai en fait une colonne Annee, et une colonne Semaine (52 valeurs possibles). Elles ne sont pas au format date car les semaines stockées (de 1 à 52) de correspondent pas aux semaines calendaires.

    Le problème est que je dois faire la récupération sur la durée de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT annee, semaine, "traitement" FROM maTable WHERE annee = 2010 AND semaine BETWEEN 40 AND 52 GROUP BY annee, semaine
     
    SELECT annee, semaine, "traitement" FROM maTable WHERE annee = 2011 AND semaine BETWEEN 1 AND 52 GROUP BY annee, semaine
     
    SELECT annee, semaine, "traitement" FROM maTable WHERE annee = 2012 AND semaine BETWEEN 1 AND 10 GROUP BY annee, semaine
    Traitement peut être une somme ou une moyenne.

    Ceci étant fait sur une table contenant plusieurs centaines de milliers d'enregistrement, et devant être répété plusieurs dizaines de fois, ce traitement peut-être un peu lourd.

    Mes questions sont : Y a t-il un moyen de synthétiser ces requêtes dont le choix des semaines diffère en fonction de l'année?

    J'avais pensé à mettre en place un partitionnement par année, peut-être même un sous partitionnement par semaine (à voir avec mon responsable si les autres requêtes sont également en fonction de ces données). Serait-ce vraiment efficace?

    Y a t-il un autre moyen d’améliorer la récupération de ces données?

    Merci d'avance pour vos idées

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Bonjour,

    si vous avez des index sur année et semaine ça devrait être très rapide comme requête

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Si le traitement est le même sur les trois requêtes et que tu cherches une requête qui globalise les 3 (1 traitement sur l'ensemble des 3 périodes), tu peux utiliser cette démarche :
    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
    SELECT annee, semaine, traitement(parametre)
    FROM maTable
    WHERE
    	(
    		annee = 2010 
    		AND semaine BETWEEN 40 AND 52
    	)
    	OR
    	(
    		annee = 2011 
    		AND semaine BETWEEN 1 AND 52
    	)
    	OR
    	(
    		annee = 2012 
    		AND semaine BETWEEN 1 AND 10
    	)
    GROUP BY annee, semaine
    Si tu dois faire trois traitements indépendants, tu peux utiliser cette autre démarche :
    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
    SELECT annee, semaine, 
    	traitement
    	(
    		CASE
    			WHEN annee = 2010 
    				AND semaine BETWEEN 40 AND 52
    			THEN parametre
    		END
    	) AS traitement_1,
    	traitement
    	(
    		CASE
    			WHEN annee = 2011 
    				AND semaine BETWEEN 1 AND 52
    			THEN parametre
    		END
    	) AS traitement_2,
    	traitement
    	(
    		CASE
    			WHEN annee = 2012 
    				AND semaine BETWEEN 1 AND 10
    			THEN parametre
    		END
    	) AS traitement_3
    FROM maTable
    GROUP BY annee, semaine
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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
    Citation Envoyé par Maniz Voir le message
    Mes questions sont : Y a t-il un moyen de synthétiser ces requêtes dont le choix des semaines diffère en fonction de l'année?
    Avec des OR ou des UNION ALL tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT annee, semaine, "traitement" FROM maTable WHERE annee = 2010 AND semaine BETWEEN 40 AND 52 GROUP BY annee, semaine
     UNION ALL
    SELECT annee, semaine, "traitement" FROM maTable WHERE annee = 2011 AND semaine BETWEEN  1 AND 52 GROUP BY annee, semaine
     UNION ALL 
    SELECT annee, semaine, "traitement" FROM maTable WHERE annee = 2012 AND semaine BETWEEN  1 AND 10 GROUP BY annee, semaine;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT annee, semaine, "traitement"
        FROM maTable
       WHERE (annee = 2010 AND semaine BETWEEN 40 AND 52)
          OR (annee = 2011)
          OR (annee = 2012 AND semaine BETWEEN  1 AND 10)
    GROUP BY annee, semaine
    Citation Envoyé par Maniz Voir le message
    Y a t-il un autre moyen d’améliorer la récupération de ces données?
    Vous pouvez pré-calculer ces données dans un traitement de nuit par exemple, vos années ne feront plus que 52 lignes et les requêtes seront extrêmement rapides.
    Si vous travaillez sur un SGBD un tant soit peu au point vous pouvez vous intéresser aux fonctionnalités de vues matérialisées / indexées.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2011
    Messages : 70
    Par défaut
    Oulah merci bien pour ces trois méthodes qui me plaisent bien sur la récupération des donnée.
    Je ne connaissais pas le UNION ALL, cela pourra peut-être me servir.

    En ce qui concerne la vue matérialisé, ceci me parait très intéressant, je ne pensais pas que l'on pouvait les matérialiser. Bien que ici ce soit impossible car les tables et le champ sujet au traitement changeront au fil du temps en fonction des entrée utilisateurs, je garderais tout de même cela dans un coin de ma tête pour de futures utilisations

    Et pour le CASE, j'avais regardé mais sans succès, je vais m'y pencher un peu plus pour bien comprendre son fonctionnement et son utilisation, cela peut toujours servir.

    Enfin bref, merci à vous pour tant d'informations, vous m'avez bien aidé, j'ai plus qu'à choisir sur quel axe je vais me lancer

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

Discussions similaires

  1. Utiliser un alias de colonne dans une clause Where MS SQL
    Par sir dragorn dans le forum Langage SQL
    Réponses: 11
    Dernier message: 12/10/2011, 09h31
  2. fonction booleenne dans une clause where ?
    Par user_h dans le forum Oracle
    Réponses: 1
    Dernier message: 20/10/2005, 15h05
  3. Ordre des tests dans la clause WHERE
    Par Tans98 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/09/2004, 10h52
  4. probleme avec le caractere 'Z' dans ma clause WHERE
    Par dibox dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/04/2004, 12h21

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