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

SQL Oracle Discussion :

Requête ne conservant que les dates de fin de mois et les dix valeurs maximales à chacune de ces dates [9iR2]


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Requête ne conservant que les dates de fin de mois et les dix valeurs maximales à chacune de ces dates
    Bonjour,

    Je débute en SQL (SQL2) et j'atteinds mes premières limites sur une requête

    Il s'agit de retrouver des données chiffrées pour des entreprises à chaque fin de mois depuis 5 ans et en ne conservant que les 10 valeurs maximales.

    Evidement les bases correspondantes contiennent toutes les données pour tous les jours ouvrés.

    Ma requête actuelle fonctionne très bien pour obtenir toutes ces données que j'ai ensuite élaguer avec excel pour plus de facilité mais j'aimerais quand même mettre au point la requête ultime qui ne sélectionerait que les données finales directement (date fin de mois et 10 max donc).

    J'ai essayé d'implémenter plusieurs solutions pour les deux aspects du problème séparement sans succès (LIMIT, TOP, PERCENT_RANK, ...)

    Je pense que la difficulté supplémentaire vient du fait que mes données proviennent de plusieurs bases différentes.

    Une version générique (qui parlera plus que la requête brute pleine de conditions) pour qui veut bien m'aider ressemblerait à ça:

    T1 contient une donnée par jour (donc contient les dates)
    T3 contient une autre donnée par jour (idem)
    T2 contient le nom de l'entreprise et la référence de cette entreprise dans les autres bases

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT T1.Madate, T2.NomEntreprise, T3.DonnéeChiffrée1, T1.DonnéeChiffrée2
    FROM Matable1 T1, Matable2 T2, Matable3 T3
    WHERE T1.Madate >to_date('01-APR-2008', 'dd-MON-yyyy')
    AND T3.Madate = T1.Madate
    AND T2.NomEntreprise = 'cequetuveux.com'
    AND T3.EntrepriseID = T2.EntrepriseID
    AND T1.EntrepriseID = T2.EntrepriseID
    ORDER BY T1.Madate, T3.DonnéeChiffrée1
    Le but étant évidement d'avoir les 10 valeurs maximales de T3.DonnéeChiffrée1 par jour et pas les 10 valeurs maximales de toute la base.

    Par avance merci à qui voudra bien m'éclairer,

    L

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) Quel est votre SGBD ?

    3) Quelle est la structure des tables ?

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    1) Je fais du SQL 2 heures par jour depuis 1 semaine, je n'ai aucune idée de comment joindre mes tables autrement

    2) J'utilise Oracle SQL Developer sur le SGBD ORACLE Version 9i2

    3) Les tables présentent leurs données en ligne, une colone par type de données. Si telle est la question.

  4. #4
    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,

    Vous pouvez utiliser les fonctions fenêtrées.

    Je n'ai pas compris exactement ce que vous voulez (un petit jeu d'essai + résultat attendu aiderait), mais sur le principe (et avec les jointures "CinePhil compliant" ) ça 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    SELECT 
    			T1.Madate
    		,	T2.NomEntreprise
    		,	T3.DonnéeChiffrée1
    		,	T1.DonnéeChiffrée2
    FROM
    	(
    		SELECT 
    			T1.Madate
    		,	T2.NomEntreprise
    		,	T3.DonnéeChiffrée1
    		,	T1.DonnéeChiffrée2
    		,	ROW_NUMBER() OVER(PARTITION BY T1.Madate, T2.NomEntreprise ORDER BY T3.DonnéeChiffrée1 DESC) AS Rn
    		FROM Matable1 T1
    		INNER JOIN Matable2 T2
    			ON	T1.EntrepriseID = T2.EntrepriseID
    		INNER JOIN Matable3 T3
    			ON	T3.EntrepriseID = T2.EntrepriseID
    			AND 	T3.Madate = T1.Madate
    		WHERE	T1.Madate >to_date('01-APR-2008', 'dd-MON-yyyy')
    		AND	T2.NomEntreprise = 'cequetuveux.com'
     
    	) T
    WHERE T.Rn < 11
    ORDER BY 
    		T1.Madate
    	,	T3.DonnéeChiffrée1

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Essayez ainsi :
    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
    With SR as
    (
      SELECT T1.Madate, T2.NomEntreprise, T3.DonnéeChiffrée1, T1.DonnéeChiffrée2
           , row_number() over(partition by T1.Madate order by T3.DonnéeChiffrée1 DESC) as rn
        FROM Matable1 T1
        JOIN Matable2 T2 ON T2.EntrepriseID = T1.EntrepriseID
        JOIN Matable3 T3 ON T3.EntrepriseID = T1.EntrepriseID
                        AND T3.Madate       = T1.Madate
       WHERE T1.Madate > add_months(trunc(sysdate, 'mm'), -12*5)
         AND T1.Madate = last_day(T1.Madate)
         AND T2.NomEntreprise = 'cequetuveux.com'
    )
      SELECT Madate, NomEntreprise, DonnéeChiffrée1, DonnéeChiffrée2
        FROM SR
       WHERE rn <= 10
    ORDER BY T1.Madate           ASC
           , T3.DonnéeChiffrée1 DESC;
    Attention j'ai supposé que vos dates n'avaient pas de composante horaires.

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses et leur rapidité !

    Je vais (essayer d')implémenter vos solutions et je reviendrai confirmer qu'elles fonctionnent ou poser d'autre questions .

    Merci encore


    [Edit 04/04/13 10h40]

    Bonjour messieurs.

    J'ai implémenté à mon cas la solution de Waldar avec succès et je n'ai pas essayé celle de Aieeeuuu étant donné que je ne vois pas le traitement de la condition sur la date dedans mais je suposse que cela fonctionne sans problème concernant la sélection des 10 données max.

    J'aurais du le préciser également mais mes bases ne contiennent que des jours ouvrés, du coup LAST_DAY me fait rater certaines fins de mois. J'ai essayé en sélectionnant la date avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRUNC(C.MKT_DATE, 'MM')
    et en prenant les données à J-1 mais apparemment cela se comporte de la même manière que LAST_DAY.

    Quoiqu'il en soit il s'agit d'un autre sujet qui j'imagine a déjà été abondement traité donc je vais aller faire un tour sur le web pour voir ça. (Je ne suis pas contre un exposé rapide cela dit..)

    Merci beaucoup,

    L.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Lostarot Voir le message
    J'aurais du le préciser également mais mes bases ne contiennent que des jours ouvrés, du coup LAST_DAY me fait rater certaines fins de mois.
    Tu peux implémenter le Calendrier avec jours fériés proposé par Waldar

  8. #8
    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
    Citation Envoyé par Lostarot Voir le message
    J'ai implémenté à mon cas la solution de Waldar avec succès et je n'ai pas essayé celle de Aieeeuuu étant donné que je ne vois pas le traitement de la condition sur la date dedans mais je suposse que cela fonctionne sans problème concernant la sélection des 10 données max.
    Oui, prenez la solution de Waldar qui est plus complète, je n'avais pas saisi votre histoire de date... La requête que je vous proposais concernait donc bien uniquement la technique pour obtenir les 10 derniers par entreprise...

    Attention par contre, si vous voulez le résultat pour toutes les entreprises (et que donc vous enlevez le AND T2.NomEntreprise = 'cequetuveux.com') à modifier le partitionnement en conséquence.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/02/2014, 11h33
  2. [2005] Liste de dates de fin de mois entre deux dates
    Par scornille dans le forum Développement
    Réponses: 2
    Dernier message: 16/09/2013, 16h03
  3. Réponses: 1
    Dernier message: 18/08/2006, 11h01
  4. Réponses: 5
    Dernier message: 24/07/2006, 15h01
  5. gestion de date de fin de mois
    Par bzh56 dans le forum Bases de données
    Réponses: 4
    Dernier message: 14/01/2005, 11h15

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