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

Requêtes PostgreSQL Discussion :

Scoring / Classement [9.2]


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Par défaut Scoring / Classement
    Bonjour à tous,

    Je fais appel à vous car je souhaiterais faire un scoring des mes clients.

    J'ai à disposition une table de fait : facturation.

    Cette table est au niveau de détails de la facture. Donc pour tous mes clients j'ai toutes leurs factures.

    Dans un 1er temps j'ai créé un 'WITH' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	WITH scoring as (
    	SELECT
    			code_produit as produit,
    			code_ville as ville,
    			code_activite as activite,
    			raisonsociale as client,
    			montant_ht,        
    			annee_emission_facture
    	FROM    facturation f
    	)
    Dans un 2nd temps, j'ai créé la requête qui me permet d'avoir le classement des mes clients :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            SELECT 
                    client,
                    sum(montant_ht) as montant_ht,
                    rank() OVER ( ORDER BY Sum(montant_ht) DESC) as rank2
            FROM scoring
            group by client
    Là où cela se complique : lorsque l'on me demande de n'afficher que les 2 premiers clients, je dois créer un client 'Total' qui serait la somme de mes 2 premiers clients :

    Par exemple:
    TOTAL_CLIENT 5000
    CLIENT_1 3500
    CLIENT_2 1500

    J'ai bien tenté de faire ça :
    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
     
    Select * from (
            SELECT 
                    client,
                    sum(montant_ht) as montant_ht,
                    rank() OVER ( ORDER BY Sum(montant_ht) DESC) as rank2
            FROM scoring
            group by client
    UNION
            SELECT
                    'Z_Total' as client,
                    sum(montant_ht) as montant_ht,
                    0 as rank2
            FROM scoring)A
    WHERE a.rank2 <=2
    Mais sur la colonne 'Z_Total', il me somme toutes les lignes de ma table, il ne prend pas en compte le rank.
    Sachant que dans le meilleur des mondes, il faudrait que je n'ai qu'une seule fois la clause Where rank2 <=2Pouvez-vous m'orienter sur la solution ?
    Je me tiens à votre disposition.

    Cordialement.
    Un néophyte

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 137
    Par défaut
    Les expressions de table peuvent s'enchainer dans la clause WITH...
    Par exemple :
    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
    WITH    scoring
    AS  (   SELECT  ...
        )
        ,   rang
    AS  (   SELECT  client
                ,   SUM(montant_ht) AS montant_ht
                ,   RANK() OVER (ORDER BY SUM(montant_ht) DESC) as rank2
            FROM    scoring
            GROUP BY client
        )
        ,   selection
    AS  (   SELECT  client
                ,   montant_ht
            FROM    rang
            WHERE   rank2   <= 2
        )
        SELECT  client 
             ,  montant_ht
        FROM    selection         
    UNION
        SELECT  'Z_Total' as client
            ,   SUM(montant_ht) AS montant_ht
        FROM    selection
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Par défaut
    Bonjour al1_24,

    Merci pour votre réponse.

    Je vais essayer d'étoffer ma requête en y intégrant la notion de Produit et la notion d’activité.

    Le résultat final souhaité est le suivant :

    Produit_1 Produit_2 Produit_3 Produit_4 Produit_5 Somme_Produit % / total
    TOTAL_CLIENT 1500 3500 2500 600 850 8950 100%
    CLIENT_1 500 2500 1250 100 300 4650 51.95%
    CLIENT_2 1000 1000 1250 500 550 4300 48.05%

    Les produits 1 à 5 existent dans ma table, en revanche 'Somme_Produit' et '% / total' n'existent pas.

    Donc il va falloir que je crée un produit de type 'Somme_Produit' et un autre produit de type '% / total'.

    Je reviendrai vers vous si j'ai des questions et/ou si j'ai réussi à faire la requête (si cela peux servir aux autres )

    Cordialement.
    Un néophyte

  4. #4
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Par défaut
    Voilà avec la requête finalisée :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    ------------------------------------------------------------------------DEBUT------------------------------------------------------------------------
    WITH scoring as (
    				SELECT
    						code_produit as produit,
    						code_ville as ville,
    						code_activite as activite,
    						raisonsociale as client,
    						montant_ht,        
    						annee_emission_facture
    				FROM    facturation f
    , rang AS       (
                    SELECT  client,
                            SUM(montant_ht) AS montant_ht,
                            RANK() OVER (ORDER BY SUM(montant_ht) DESC) as rank2
                    FROM    scoring
                    GROUP BY client
     
            )
    , rang1 AS      (    
                    SELECT  r.client,
                            S1.produit,
                            SUM(s1.montant_ht) as montant_ht,
                            rank2
            FROM    scoring s1
                            INNER JOIN rang r on r.client = s1.client
                    GROUP BY        r.client,
                                    S1.produit,
                                    r.rank2
            )        
    , selection AS (
                    SELECT  client,
                            montant_ht,
                            produit,
                            rank2      
                    FROM    rang1
                    WHERE   rank2   <=5
    )
    ------------------------------------------------------------------------FIN ------------------------------------------------------------------------
    SELECT * FROM (
    ---PAR PRODUIT
            SELECT  client,
                    produit,               
                    SUM(montant_ht) as montant_ht,
                    rank2               
            FROM    selection
            GROUP BY client,produit,rank2
    UNION
    ---TOTAL PAR CLIENT
            SELECT  client,
                   'Y_Total' as produit,
                    SUM(montant_ht) as montant_ht,
                    rank2
            FROM    selection
            GROUP by client,rank2
     
    UNION
    ---Client total : par produit
            SELECT 'Z_Total' as client,
                    produit,
                    SUM(montant_ht) as montant_ht,
                    0 as rank2
             FROM   selection               
             GROUP by produit
    UNION
    ---Client total : tous produits
            SELECT  'Z_Total' as client,
                    'Y_Total' as produit,
                    SUM(montant_ht) AS montant_ht,
                    0 as rank2
            FROM    selection
     
    UNION
    --- % par client
            SELECT  A.client as client,
                    'Z_% / total'::varchar(255) as produit,
                    A.montant_ht / ( SELECT  SUM(montant_ht) AS montant_ht   FROM selection)  as montant_ht,              
                    A.rank2
            FROM  (
                    SELECT 
                            client,
                            'Z_% / total' as produit,
                            SUM(montant_ht) as montant_ht,
                            rank2
                    FROM selection
                    GROUP by client,rank2
                  )A
    UNION
    --- % Total   
            SELECT 
                    'Z_Total' as client,
                    'Z_% / total' as produit,
                    1 as montant_ht,
                    0 as rank2
            FROM    selection      
     
    )globale
    S'il y a possibilité de l'améliorer pour un gain de performance et de lisibilité je suis preneur.

    Cordialement
    Un néophyte

  5. #5
    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
    Votre requête est trop compliquée.
    Pouvez-vous fournir une quinzaine de lignes représentatives de la table facturation ?

  6. #6
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Par défaut
    Bonsoir,

    En PJ le résultat.

    Je me tiens à votre disposition.

    Cordialement.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [MySQL-5.6] Classement selon un score avec somme et comptage
    Par yoshï dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/11/2014, 12h39
  2. Classement score stocké en XML
    Par italiano1360 dans le forum C#
    Réponses: 3
    Dernier message: 18/05/2011, 15h24
  3. [AC-2007] Classement par Equipe sur le total des 3 meilleurs scores
    Par ctsblv dans le forum Access
    Réponses: 10
    Dernier message: 07/12/2010, 13h20
  4. [Requête] Classement de Scores
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 13
    Dernier message: 01/10/2006, 19h11
  5. Classement daté
    Par Gzip dans le forum Linux
    Réponses: 7
    Dernier message: 26/04/2004, 22h56

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