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 :

Aide automatisation requête SQL


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Chargé d'etude statistiques
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'etude statistiques

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Aide automatisation requête SQL
    Bonjour,

    Je cherche à automatiser un code.

    Aujourd’hui je récupère le 27 du mois les clients qui auront 21 ans le mois suivant.

    Donc tous les mois je dois exécuter ma requête.



    Je voudrai pouvoir automatiser et créer une table pour tous ceux qui auront 21 ans en janvier, une autre pour ceux qui auront 21 ans en février, 21 ans en mars, etc

    De plus je voudrai pouvoir faire pareil pour 65 ans, 18 ans, 16 ans, enfin différent âge.



    Voici ma requête aujourd’hui :



    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
    DECLARE @DateLancement datetime
     
    DECLARE @DateRef datetime
     
     
     
    SET @DateLancement = GetDate()
     
    SET @DateRef=@DateLancement+14
     
     
     
    --Tous les clients = 20 ans
     
    Select a.CLIENT, convert(char,DANAIS,112) as DANAIS, datediff(day,DANAIS,GetDate())/365 Age
     
    from TAB1
     
    where datediff(day,DANAIS,GetDate())/365=20
     
    group by a.CLIENT _CALCULE, DANAIS
     
     
     
    --Clients qui auront 21 ans dans un mois
     
    select *
     
    from TAB1
     
    where datediff(month,@DateRef,dateadd(yy,21,DANAIS))=1

    Vous avez des idées ?

    Je vous remercie d’avance pour vos retours.



    Bien cordialement.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 269
    Points
    38 269
    Billets dans le blog
    9
    Par défaut
    Si l'on crée un objet table pour chaque sous-ensemble tous les mois, le nombre de tables va être pléthorique !

    Quelles est la base de données, quelles sont les colonnes index et quels sont les volumes à traiter ?
    il est très probable que les temps de réponse soient très mauvais car les fonctions de colonnes genre datediff vont proscrire l'utilisation des index
    Si les volumes sont conséquents, il est plus sage de définir des index sur les critères de date, calculer par traitement les dates de début et fin de mois du where et appliquer une requete between sur ces critères

  3. #3
    Candidat au Club
    Femme Profil pro
    Chargé d'etude statistiques
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'etude statistiques

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci pour votre aide, il est vrai que les volumes sont important, la solution avec du calcul des début et fin de mois semble donc mieux adapté.

    Savez-vous comment faut-il faire ?



    Je vous remercie d’avance pour votre précieuse aide.



    Cordialement,

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 269
    Points
    38 269
    Billets dans le blog
    9
    Par défaut
    Vous êtes sur quelle plate forme et quelle base de données ?

    S'il y a un robot d'exploitation, il est souvent possible de faire calculer les dates de début et de fin par ce robot, et là c'est très simple

    Sinon un petit programme qui calcule à partir de la date du jour le premier et le dernier jour du mois suivant

    Dans les 2 cas on utilise ces 2 dates pour exécuter une requete avec where madate between :datedeb and :datefin

  5. #5
    Candidat au Club
    Femme Profil pro
    Chargé d'etude statistiques
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'etude statistiques

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je ne connais pas la plateforme, je ne pense pas qu’il y ai de robot d’exploitation.

    La base de donnée est interne à mon entreprise.



    Je ne comprends pas très bien comment avec un between ça va gérer juste qui sont les clients qui auront leur anniversaire entre le 1er juillet et le 31 septembre par exemple mais je n’aurai pas la distinction par mois.

    De plus ‘madate’ ça correspond à la date de naissance du coup ou la date ou je lance le programme ?



    Est-ce que je ne pourrai pas plutôt déclarer par exemple ma date de référence au 1er janvier 2015, et faire varier de façon automatique le ‘=1’ dans le where de la ligne ci-dessous de 1 à 12 pour avoir tous les mois de l’année ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    where datediff(month,@DateRef,dateadd(yy,21,DANAIS))=1
    Merci.

  6. #6
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je pense que vous ne savez pas exactement ce que vous voulez obtenir, et que c'est en fait votre principale difficulté pour trouver une solution.

    Détaillez nous un peu le contexte (quel est le besoin derrière tout ça ?). On pourra alors mieux vous aider

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 269
    Points
    38 269
    Billets dans le blog
    9
    Par défaut
    La base de donnée est interne à l'entreprise, certes, mais Est-ce une base oracle, sybase, DB2, SQL-server....

    Encore une fois, avec du volume dans les tables, il faut éviter une requête dont le where utilise des fonctions de colonne, sinon le temps d'exécution sera très très long et consommera inutilement de la CPU (au détriment des autre utilisateurs bien sur), c'est pourquoi je propose de calculer les bornes avant exécution de la requete.

    Pour avoir la distinction par mois, il suffit de lancer autant de fois le traitement qu'il y a de plages à restituer, exemple :
    -1- calcul de la première date de naissance et de la dernière date de naissance pour les personnes dont l'anniversaire des 21 ans sera le mois prochain
    -2- exécution de la requête dont le between utilise les 2 dates du -1-, bien sur il ne s'agit pas de la date de traitement, mais de la date de naissance

    Si d'autres plages sont à extraire, ceux qui auront 16 ans par exemple, on peut lancer exactement les mêmes opérations, en parallèle, mais en changeant le critère de calcul de l'opération 1.

    Ainsi c'est simple, réutilisable, et surtout indexable donc rapide quelque soit les volumes des tables, il suffit d'avoir un index, multiple bien sur, sur la date de naissance

  8. #8
    Candidat au Club
    Femme Profil pro
    Chargé d'etude statistiques
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'etude statistiques

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je cherche à prévoir quels seront les client qui auront 21 ans au dernier trimestre de l’année.

    Jusqu’à aujourd’hui chaque fin mois je récupère uniquement dans une table les clients qui auront 21 ans le mois prochain.

    Je cherche donc une méthode pour avoir le moins de manipulation à faire pour obtenir dans une table les clients qui auront 21 ans en octobre, novembre ou décembre prochain.

    Mon but est donc d’obtenir plus de visibilité sur la fin de l’année mais j’aimerai pouvoir réutiliser ce code pour le 1er trimestre de l’année prochaine par exemple.



    Cordialement,

  9. #9
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Toujours pas compris le fond.

    Citation Envoyé par aurelie.b
    Je cherche à prévoir quels seront les client qui auront 21 ans au dernier trimestre de l’année.
    pour les obtenir de façon dynamique par rapport à l'année courante (sous SQLServer, ça semble être votre cas) :

    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 ...
    FROM LaTable
    WHERE DateNaissance >=
    	DATEADD(
    		QUARTER
    		,3
    		,DATEADD(
    			YEAR
    			,DATEDIFF(
    				YEAR
    				,0
    				,CURRENT_TIMESTAMP
    			) - 21
    			,0
    		)
    	)
    AND DateNaissance < 
    	DATEADD(
    		YEAR
    		,DATEDIFF(
    			YEAR
    			,0
    			,CURRENT_TIMESTAMP
    		) -20
    		,0
    	)
    Partant de là, vous pouvez adapter à vos besoins, pour la rendre plus dynamique (saisie de date en entée, ou d'une année et d'un numéro de trimestre,...)

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 269
    Points
    38 269
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par aurelie.b Voir le message
    Je cherche à prévoir quels seront les client qui auront 21 ans au dernier trimestre de l’année.

    Jusqu’à aujourd’hui chaque fin mois je récupère uniquement dans une table les clients qui auront 21 ans le mois prochain.

    Je cherche donc une méthode pour avoir le moins de manipulation à faire pour obtenir dans une table les clients qui auront 21 ans en octobre, novembre ou décembre prochain.

    Mon but est donc d’obtenir plus de visibilité sur la fin de l’année mais j’aimerai pouvoir réutiliser ce code pour le 1er trimestre de l’année prochaine par exemple.



    Cordialement,
    relisez attentivement ma réponse postée à 15h25, elle répond exactement à votre besoin, il suffit de paramétrer le module qui calcule les dates du between et le tour est joué

  11. #11
    Candidat au Club
    Femme Profil pro
    Chargé d'etude statistiques
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'etude statistiques

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour vos réponses, elles ont pu m'aider à avancer.

    Cordialement.

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

Discussions similaires

  1. Aide pour requête SQL assez simple
    Par Pilloutou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 28/03/2008, 16h07
  2. Besoin d'aide pour requête SQL
    Par dinver78 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/05/2007, 19h20
  3. Besoin d'aide pour requête SQL
    Par vallica dans le forum Requêtes
    Réponses: 10
    Dernier message: 09/06/2006, 00h16
  4. aide sur requête sql
    Par Vodkha dans le forum Langage SQL
    Réponses: 9
    Dernier message: 30/08/2005, 18h53
  5. Aide sur Requête SQL
    Par devdev dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/05/2005, 13h33

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