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 :

PIVOT sur les quantités et somme des montants


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut PIVOT sur les quantités et somme des montants
    Bonjour,
    Voilà bien longtemps que je ne suis pas venu sur le forum...

    Mon problème:
    1 requête me permet d'obtenir le résultat suivant
    Commande Article Taille Quantité Montant
    #0001 TeeShirt S 10 105
    #0001 TeeShirt M 20 220
    #0001 TeeShirt L 30 345
    #0001 TeeShirt XL 40 480

    A partir de là je souhaite obtenir le résultat suivant :
    Commande Article Montant_total S M L XL
    #0001 TeeShirt 1150 10 20 30 40

    Mais lorsque j'utilise la fonction PIVOT pour placer mes tailles en colonnes, les montants ne s'additionnent pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select Commande, Article, Montant, S, M, L XL
    from myQuery
    pivot (sum(Quantité) for Taille in ('S','M','L','XL'))
    On pourrait pas mettre un sum quelque part ? Un peu dans le genre de ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select Commande, Article, sum(Montant) as Montant_total, S, M, L XL
    from myQuery
    pivot (sum(Quantité) for Taille in ('S','M','L','XL'))
    group by Commande, Article, S, M, L XL

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    Pour info, découper la requête pour faire la somme des montants d'un côté et le pivot sur les quantités d'un autre est évidemment une solution mais j'aurais aimé trouver un moyen de le faire directement pour ne pas appeler 2 fois myQuery dans mon plan d'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select tot.Commande, tot.Article, tot.Total, piv.S, piv.M, piv.L, piv.XL
    from (select Commande, Article, sum(Montant) as Total from myQuery group by Commande, Article) tot
    inner join (select Commande, Article, S, M, L XL from myQuery pivot (sum(Quantité) for Taille in ('S','M','L','XL'))) piv on tot.Commande = piv.Commande and tot.Article = piv.Article

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quel est votre problème, je ne vois pas pourquoi vos quantités devraient être plus additionnées qu'elle ne le sont déjà.
    Quel est le résultat que vous souhaitez obtenir ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    Lorsque j'utilise la fonction PIVOT pour placer mes quantités en colonnes, les montants ne s'additionnent pas...

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pourquoi devraient-il s'additionner ?
    Vous séparez par taille, pourquoi voudriez-vous mélanger des S avec des M ?

    Pouvez-vous présenter un résultat attendu ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ah je pense avoir compris, vous voulez pivoter pour avoir quantité ET montant ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    OK ce qui est bizarre c'est qu'hier il me semblait avoir essayé la solution suivante sans succès... et pourtant ça à l'air de fonctionner aujourd'hui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select Commande, Article, sum(Montant) as Montant, sum(S) as S, sum(M) as M, sum(L) as L, sum(XL) as XL
    from myQuery
    pivot (sum(Quantite) for Taille in ('S' as "S",'M' as "M",'L' as "L",'XL' as "XL"))
    group by Commande, Article
    Si j'arrive à reproduire le problème, je placerai un nouveau commentaire.
    Sinon, j'indiquerai que le topic est Résolu...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    Après quelques tests, j'ai trouvé comment reproduire le problème qui vient du fait que mes montants sont identiques.

    Voilà ma table de départ (mise à jour):
    Commande Article Taille Quantité Montant
    #0001 TeeShirt S 10 100
    #0001 TeeShirt M 10 100
    #0001 TeeShirt L 10 100
    #0001 TeeShirt XL 10 100

    Lorsque j'exécute la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select Commande, Article, sum(Montant) as Montant_total, sum(S) as S, sum(M) as M, sum(L) as L, sum(XL) as XL
    from myQuery
    pivot (sum(Quantite) for Taille in ('S' as "S",'M' as "M",'L' as "L",'XL' as "XL"))
    group by Commande, Article;
    J'obtiens :
    Commande Article Montant_total S M L XL
    #0001 TeeShirt 100 10 10 10 10

    Alors que je pensais obtenir :
    Commande Article Montant_total S M L XL
    #0001 TeeShirt 4*100 = 400 10 10 10 10

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Oui, en effet la somme des montants est faite après le pivot.

    Vu que la colonne montant n'apparaît pas dans le pivot, elle est traitée comme un axe d'analyse, on s'en rend compte avec ce jeu de test :
    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 cte_data (commande, article, taille, quantite, montant) as
    (
    select '#0001', 'TeeShirt', 'S' , 10, 100 from dual union all
    select '#0001', 'TeeShirt', 'M' , 20, 100 from dual union all
    select '#0001', 'TeeShirt', 'L' , 30, 100 from dual union all
    select '#0001', 'TeeShirt', 'XL', 40, 101 from dual
    )
    select *
     pivot (sum(quantite) for taille in ( 'S'  as s
                                        , 'M'  as m
                                        , 'L'  as l
                                        , 'XL' as xl));
     
    COMMANDE ARTICLE     MONTANT          S          M          L         XL
    -------- -------- ---------- ---------- ---------- ---------- ----------
    #0001    TeeShirt        101                                          40
    #0001    TeeShirt        100         10         20         30
    Je pense qu'il faut laisser pivot de côté et utiliser des bons case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      select commande
           , article
           , sum(montant)                                        as montant
           , sum(case taille when 'S'  then quantite else 0 end) as qte_s
           , sum(case taille when 'M'  then quantite else 0 end) as qte_m
           , sum(case taille when 'L'  then quantite else 0 end) as qte_l
           , sum(case taille when 'XL' then quantite else 0 end) as qte_xl
        from cte_data
    group by commande
           , article;
     
    COMMANDE ARTICLE     MONTANT      QTE_S      QTE_M      QTE_L     QTE_XL
    -------- -------- ---------- ---------- ---------- ---------- ----------
    #0001    TeeShirt        401         10         20         30         40

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/01/2012, 12h43
  2. Réponses: 7
    Dernier message: 14/04/2008, 17h13
  3. Réponses: 0
    Dernier message: 31/01/2008, 11h23
  4. Réponses: 4
    Dernier message: 01/08/2007, 17h22
  5. faire la somme des montants d'une table
    Par nestam dans le forum Requêtes
    Réponses: 3
    Dernier message: 15/02/2007, 00h15

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