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 :

Sommeprod de 2 colonnes, dans une seule ligne


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Auditeur financier
    Inscrit en
    Mars 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Sommeprod de 2 colonnes, dans une seule ligne
    Bonjour,

    j'aimerais faire une sommeprod (multiplication matricielle de 2 colonnes) suivant 2 cas différents.
    > ma table comporte 4 colonnes :
    ref, itype (soit 1 soit X), montant, Qté

    > Dans les 2 cas, je cherche à faire faire une sommeprod des colonnes Montant * Qté

    > dans les 2 cas, ce qui m'intéresse particulièrement c'est la sommeprod des itype = X

    1) cas 1: je cherche à afficher les colonnes ref et itype et sommeprod, en affichant la sommeprod des itype = X dans toute la colonne
    2) cas 2: je cherche cette fois-ci à n'afficher que les colonnes ref et sommeprod, sur autant de ref différentes présentes dans la colonne ref (dans mon exemple il n'y a qu'une seule ref)

    Ma requête suivante ne fonctionne pas, puisqu'elle m'affiche autant de lignes que dans la table source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
     
    ref,
    sum(case when itype like 'X' then Qté*montant else Qté*montant end) over (partition by itype)
     
    from matable
    => Avez-vous la solution ?

    Merci bcp !

    Nom : Exemple.png
Affichages : 204
Taille : 74,3 Ko

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    C'est cela que tu cherches à faire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select  ref
        ,   itype
        ,   sum(qte * montant)  as  sommeprod
    from    matable
    group by ref
        ,   itype
    PS : a priori, les résultats de calcul que tu affiches sont erronés.
    Tu devrais avoir :
    A 1 8
    A X 328
    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
    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
    Cas 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select ref, sum(Qté * montant) as sommeprod
        from matable
       where itype = 'X'
    group by ref
    Cas 1 :
    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_distinct (ref, itype) as
    (
    select distinct ref, itype
      from matable
    )
      ,  cte_sommeprod (ref, sommeprod) as
    (
      select ref, sum(Qté * montant)
        from matable
       where itype = 'X'
    group by ref
    )
    select t1.ref
         , t1.itype
         , t2.sommeprod
      from cte_distinct  as t1
      join cte_sommeprod as t2 on t2.ref = t1.ref;

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Auditeur financier
    Inscrit en
    Mars 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    C'est exactement ça, merci !

    Donc si je comprends bien, la fonction sum over partition n'est pas compatible avec groupe by...

    Bonne journée,
    Emmanuel

  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
    Il n'y a pas de problème entre les fonctions de fenêtrages et les agrégats, tant qu'on référence les bonnes colonnes post agrégats, mais là je ne vois pas d'utilisation à moins que vous avez une règle métier qui fait que ce sont toujours vos "X" qui contiennent les plus grandes valeurs.

  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,

    Si elle est compatible. Je pense que la requête que vous essayiez d'écrire était celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    	   Ref
        ,   itype
        ,   SUM(SUM(CASE WHEN itype = 'X' THEN montant * Qte ELSE 0 END)) OVER ()
    FROM matable
    GROUP BY 
    	   Ref
        ,   itype
    HAVING SUM(montant * Qte) > 0
    Je pense aussi qu'il y a une erreur dans le résultat attendu : n'est-ce pas 328 au lieu de 178 ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/04/2012, 11h57
  2. Concatener une colonne en une seule ligne.
    Par Contrec dans le forum Oracle
    Réponses: 3
    Dernier message: 12/10/2007, 08h51
  3. Ecrire dans une seule ligne
    Par jbidou88 dans le forum Access
    Réponses: 4
    Dernier message: 04/09/2006, 14h52
  4. regrouper des informations dans une seule ligne
    Par rozow dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/04/2006, 16h03
  5. plusieurs enregistrements dans une seul ligne
    Par Celelibi dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 15h55

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