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 :

Utilisation des fonctions analytiques [12c]


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Homme Profil pro
    Développeur WEB - Admin Réseaux
    Inscrit en
    Décembre 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Développeur WEB - Admin Réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 153
    Points : 286
    Points
    286
    Par défaut Utilisation des fonctions analytiques
    Bonjour,

    Je viens de découvrir les fonctions analytiques sous Oracle et il y quelque chose que je n'arrive pas à faire dans une requête.

    J'ai une table avec des articles, des quantité et une période.
    Je peux avoir plusieurs lignes par articles avec des quantités différentes , sur une période différentes. (Les périodes sont définies par des numéro)

    Dans un premier temps j'ai récupéré la somme des quantités par articles.

    Voici la requête et le résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select artsvstt as Art,sum(qtfsvstt+qgfsvstt)  As Qte
    from svstt
    where capsvstt in 
        (select numoecap 
        from oecap 
        where etsoecap = '20' and typoecap = 'M' 
        and to_char(to_date(dtdoecap,'YYYYMMDD'),'YYYYMM') >= to_char(ADD_MONTHS(TO_DATE(to_char(sysdate,'YYYYMMDD'), 'YYYYMMDD'), -12), 'YYYYMM')
        and to_char(to_date(dtfoecap,'YYYYMMDD'),'YYYYMM') <= to_char(ADD_MONTHS(TO_DATE(to_char(sysdate,'YYYYMMDD'), 'YYYYMMDD'), -1), 'YYYYMM'))
    and tcasvstt = 'M' 
    and typsvstt = 'F' 
    and artsvstt in ('768672','768682','768683','768696','770627','813196','851678','851679','851682','851771','854670','855010','856112','856312','870632','870633')
    group by artsvstt
    order by 2 DESC
    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
     
    ART	QTE
    813196	12438
    870632	10618
    768696	4447
    870633	3896
    854670	3349
    768672	3299
    770627	2621
    768682	2511
    851678	2079
    851679	1302
    768683	1184
    851682	1060
    851771	253
    855010	93
    856112	31
    856312	-1
    Grâce au fonction analytique je réussi à récupérer le pourcentage des quantités par article par rapport au total des quantités.

    Voici la requête et le résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select distinct artsvstt as Art,sum(qtfsvstt+qgfsvstt) OVER (partition by artsvstt)  As Qte,
    round((sum(qtfsvstt+qgfsvstt) OVER (partition by artsvstt order by artsvstt) / sum(qtfsvstt+qgfsvstt) OVER ()) *100,2) as Pourc
    from svstt
    where capsvstt in 
        (select numoecap 
        from oecap 
        where etsoecap = '20' and typoecap = 'M' 
        and to_char(to_date(dtdoecap,'YYYYMMDD'),'YYYYMM') >= to_char(ADD_MONTHS(TO_DATE(to_char(sysdate,'YYYYMMDD'), 'YYYYMMDD'), -12), 'YYYYMM')
        and to_char(to_date(dtfoecap,'YYYYMMDD'),'YYYYMM') <= to_char(ADD_MONTHS(TO_DATE(to_char(sysdate,'YYYYMMDD'), 'YYYYMMDD'), -1), 'YYYYMM'))
    and tcasvstt = 'M' 
    and typsvstt = 'F' 
    and artsvstt in ('768672','768682','768683','768696','770627','813196','851678','851679','851682','851771','854670','855010','856112','856312','870632','870633')
    order by 3 DESC
    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
     
    ART	QTE	POURCENT
    813196	12438	25,29
    870632	10618	21,59
    768696	4447	9,04
    870633	3896	7,92
    854670	3349	6,81
    768672	3299	6,71
    770627	2621	5,33
    768682	2511	5,11
    851678	2079	4,23
    851679	1302	2,65
    768683	1184	2,41
    851682	1060	2,16
    851771	253	0,51
    855010	93	0,19
    856112	31	0,06
    856312	-1	0
    Pour finir voici mon problème.
    Je souhaiterais rajoutais une colonne qui me fasse le cumul de ce pourcentage ligne après ligne.
    Pour avoir un résultat comme ceci:

    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
     
    ART	QTE	POURCENT	CUMUL
    813196	12438	25.29	25.29
    870632	10618	21.59	46.88
    768696	4447	9.04	55.92
    870633	3896	7.92	63.84
    854670	3349	6.81	70.65
    768672	3299	6.71	77.36
    770627	2621	5.33	82.69
    768682	2511	5.11	87.8
    851678	2079	4.23	92.03
    851679	1302	2.65	94.68
    768683	1184	2.41	97.09
    851682	1060	2.16	99.25
    851771	253	0.51	99.76
    855010	93	0.19	99.95
    856112	31	0.06	100.01
    856312	-1	0	100.01
    Je n'arrive pas à le faire via les fonctions analytiques car de ce que je comprend je ne peux utiliser une fonction analytique dans une fonction analytique. (les imbriqués en quelque sorte)

    Est ce que vous sauriez comment je peux faire pour avoir ce cumul des pourcentages?

    Merci d'avance

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par niuniuk36 Voir le message
    Je n'arrive pas à le faire via les fonctions analytiques car de ce que je comprend je ne peux utiliser une fonction analytique dans une fonction analytique. (les imbriqués en quelque sorte)
    Il faut passer par une sous-requête pour le calcul du cumul (SUM analytique avec ORDER BY)
    Par compte je suis dubitatif sur l'utilisation du ORDER BY dans le calcul du pourcentage (au niveau du numérateur)

  3. #3
    Membre actif
    Homme Profil pro
    Développeur WEB - Admin Réseaux
    Inscrit en
    Décembre 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Développeur WEB - Admin Réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 153
    Points : 286
    Points
    286
    Par défaut
    Bonjour,

    Merci pour ta réponse.


    Il faut passer par une sous-requête pour le calcul du cumul (SUM analytique avec ORDER BY)
    Je ne comprend pas ce que tu veux dire.

    Si je passe par une sous requête il va quand même falloir que je fasse dans un premier temps le calcul du pourcentage par l'analytique. Pour ensuite sortir le cumul.
    Mais pour sortir le cumul je dois me baser sur la colonne du pourcentage qui vient d'un calcul analytique.

    Donc au final, faire un calcul analytique par rapport à une colonne venant déjà d'un calcul analytique.
    C'est ça que je n'arrive pas à faire.



    Par compte je suis dubitatif sur l'utilisation du ORDER BY dans le calcul du pourcentage (au niveau du numérateur)
    oui effectivement, j'ai supprimé le ORDER BY.
    Du coup ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    round((sum(qtfsvstt+qgfsvstt) OVER (partition by artsvstt order by artsvstt) / sum(qtfsvstt+qgfsvstt) OVER ()) *100,2) as Pourc
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    round((sum(qtfsvstt+qgfsvstt) OVER (partition by artsvstt) / sum(qtfsvstt+qgfsvstt) OVER ()) *100,2) as Pourc
    J'ai découvert ces fonctions analytiques ce matin, du coup j'apprend encore et je patauge encore un peu

    Merci d'avance

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il n'est pas possible de faire une fonction analytique de fonction analytique au même niveau, mais en passant par une sous-requête ça devrait passer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select art, qte, Pourc, sum(Pourc) over (order by Pourc desc) as cumul
      from (la_requete)

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par niuniuk36 Voir le message
    Est ce que vous sauriez comment je peux faire pour avoir ce cumul des pourcentages?
    Bonjour,
    Pardonnez moi, mais j'ai besoin de poser la question même si cela risque de ne pas vous faire avancer: cela fait un sens de faire un SUM() OVER () sur un pourcentage ?
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  6. #6
    Membre actif
    Homme Profil pro
    Développeur WEB - Admin Réseaux
    Inscrit en
    Décembre 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Développeur WEB - Admin Réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 153
    Points : 286
    Points
    286
    Par défaut
    @skuatamad

    Merci beaucoup, ça fonctionne.
    En fait je n'avais pas compris cela au début, mais de le voir écrit ça ma "sauté au yeux"


    @Sunchaser
    En fait cela me permet d'afficher pour nos clients le % du cumul des ventes sur une familles d'articles.
    Par exemple si un client veut connaitre les articles d'une famille qui correspondent à 80% des ventes alors je lui donnerais les articles suivants : (par rapport au tableau ci-dessous.)

    813196, 870632, 768696, 870633 et 768672
    Ces 5 articles correspondent à 80% de nos ventes sur leur famille article.

    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
     
    ART	QTE	POURCENT	CUMUL
    813196	12438	27,14	27,14
    870632	10618	23,17	50,31
    768696	4447	9,7	60,01
    870633	3896	8,5	68,51
    768672	3299	7,2	75,71
    770627	2621	5,72	81,43
    768682	2511	5,48	86,91
    851678	2079	4,54	91,45
    851679	1302	2,84	94,29
    768683	1184	2,58	96,87
    851682	1060	2,31	99,18
    851771	253	0,55	99,73
    855010	93	0,2	99,93
    856112	31	0,07	100
    856312	-1	0	100
    Merci pour votre aide

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

Discussions similaires

  1. [10gR1] Utilisation des fonctions analytiques
    Par Magnus dans le forum SQL
    Réponses: 1
    Dernier message: 19/07/2007, 16h54
  2. utilisation des fonctions analytiques
    Par LEK dans le forum SQL
    Réponses: 10
    Dernier message: 03/04/2007, 13h27
  3. [hibernate] utilisation des fonctions d'aggregation
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/08/2005, 09h41
  4. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  5. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43

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