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 :

Somme d'une colonne d'enregistrement calculés


Sujet :

Langage SQL

  1. #1
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut Somme d'une colonne d'enregistrement calculés
    Salut !

    Je cherche à calculer tout simplement le montant TTC à partir des détails d'une facture.

    SGBD : PostgreSQL 8.4

    La table : stock
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      type_piece : Chaine de caractères variables
      id_piece : Auto incrément
      code_article : Chaine de caractères variables
      quantite : entier
      prix_vente_ht : double précision
    La table : facture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      id_facture : Auto incrément
      taux_tva : double précision
    En résumé : la table stock contient les détails de la facture.

    Voici un exemple :
    Stock :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type_piece        id_piece        code_article        quantite        prix_vente_ht
     
    facture            15                ar004                4                420
    facture            15                ar002                2                220
    Facture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id_facture        taux_tva
     
    15                      17
    Est-ce qu'il y a une possibilité d'avoir le total TTC de la facture ?

    Voici ce que j'ai tenté :
    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 code_article, quantite, prix_vente_ht, taux_tva,
             prix_vente_ttc, montant_ht, montant_ttc,
             SUM(montant_ttc) as montant_tot_ttc
        FROM (SELECT code_article, quantite, prix_vente_ht, taux_tva, 
                     prix_vente_ht * (1 + (taux_tva / 100)) as prix_vente_ttc,   
                     quantite * prix_vente_ht as montant_ht, 
                     (quantite * prix_vente_ht) * (1 + (taux_tva/100)) as montant_ttc
                FROM stock  
                     inner join facture
                       on id_piece = facture.id_facture 
               where id_piece = 15
                 and type_piece = 'facture') as t
    group by code_article, quantite, prix_vente_ht, taux_tva,
             prix_vente_ttc, montant_ht, montant_ttc;
    ça m'affiche que le montant ttc pour chaque article.

    Espérant que vous m'avez bien compris ?

    (Je suis un peu sous pression, donc j'ai peut-être mal cherché sur le forum )

    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Si tu veux une somme par facture il faut ne faire le group by que sur la facture.
    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  facture.id_facture , SUM(montant_ttc) as montant_tot_ttc
    FROM
    (
    SELECT  code_article, quantite, prix_vente_ht, taux_tva, 
    (prix_vente_ht * ( 1 +  (taux_tva /100)))     as prix_vente_ttc,   
    (quantite * prix_vente_ht) as montant_ht, 
    (quantite * prix_vente_ht) * (1 + (taux_tva/100)) as montant_ttc
     
    FROM stock  
    inner join facture on id_piece = facture.id_facture 
    where id_piece = 15 and type_piece = 'facture' 
    ) AS t
     
    group by facture.id_facture;
    A moins que tu veuilles le détail et le total.
    Dans ce cas il faudra, faire une sous requête de plus.
    PS: Est-ce que PostgreSQL 8.4 implémente les CTE (Common Table Expression)http://sqlpro.developpez.com/cours/s...te-recursives/
    cela pourrait t-aider si tu as besoin du détail et du total.
    A+
    Soazig

  3. #3
    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 388
    Points
    18 388
    Par défaut
    Plutôt les fonctions de fenêtrages que les CTE à mon avis.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    L'idée de CTE etait de ne coder qu'une fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (
    SELECT  code_article, quantite, prix_vente_ht, taux_tva, 
    (prix_vente_ht * ( 1 +  (taux_tva /100)))     AS prix_vente_ttc,   
    (quantite * prix_vente_ht) AS montant_ht, 
    (quantite * prix_vente_ht) * (1 + (taux_tva/100)) AS montant_ttc
     
    FROM stock  
    INNER JOIN facture ON id_piece = facture.id_facture 
    WHERE id_piece = 15 AND type_piece = 'facture' 
    )
    Dans une CTE.
    A+
    Soazig

  5. #5
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut
    Citation Envoyé par soazig Voir le message
    Bonjour,
    A moins que tu veuilles le détail et le total.
    Dans ce cas il faudra, faire une sous requête de plus.
    Oui, je voudrai les deux en même temps.

    Citation Envoyé par soazig Voir le message
    PS: Est-ce que PostgreSQL 8.4 implémente les CTE (Common Table Expression)
    Apparament oui.

    Je vais voir les exemples de SQLPro.

    Merci à vous deux de m'avoir répondu aussi vite

    Je vous tiendrai au courant.

    A+

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Avec les CTE la requete pourrait resembler à cela
    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
     
    WITH
       Q_detail (id_facture,code_article, quantite, prix_vente_ht, taux_tva,prix_vente_ttc,montant_ht,montant_ttc)
       AS 
        (
    		SELECT  facture.id_facture,code_article, quantite, prix_vente_ht, taux_tva, 
    		(prix_vente_ht * ( 1 +  (taux_tva /100)))     as prix_vente_ttc,   
    		(quantite * prix_vente_ht) as montant_ht, 
    		(quantite * prix_vente_ht) * (1 + (taux_tva/100)) as montant_ttc
     
    		FROM stock  
    		inner join facture on id_piece = facture.id_facture 
    		where id_piece = 15 and type_piece = 'facture' 
    	) 
    SELECT D.id_facture,code_article, quantite, prix_vente_ht, taux_tva,prix_vente_ttc,montant_ht,montant_ttc,montant_tot_ttc
    FROM Q_detail D
    	INNER JOIN (	SELECT  id_facture , SUM(montant_ttc) as montant_tot_ttc
    					FROM Q_detail
    					group by id_facture
    				) as T
    on D.id_facture= T.id_facture
    A+
    Soazig

  7. #7
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut
    Re!

    Au fait, j'ai pas Postgresql 8.4, mais plutôt 8.3, et ce dernier ne prend pas en charge les CTE

    je vien de tester quelques exemples sur les deux version, et effectivement, ça marche dans 8.4 et non pas 8.3.

    Y a pas d'autre moyens sans les CTE ?

  8. #8
    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 388
    Points
    18 388
    Par défaut
    Citation Envoyé par soazig Voir le message
    L'idée de CTE etait de ne coder qu'une fois...
    Certes, mais l'idée de la fonction de fenêtrage n'est de ne parcourir qu'une fois chaque table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT s.id_piece, s.code_article, s.quantite, s.prix_vente_ht, f.taux_tva, 
           s.prix_vente_ht * (1 + f.taux_tva / 100) as prix_vente_ttc,   
           s.quantite * s.prix_vente_ht as montant_ht, 
           (s.quantite * s.prix_vente_ht) * (1 + f.taux_tva / 100) as montant_ttc
           sum((s.quantite * s.prix_vente_ht) * (1 + f.taux_tva / 100)) over(partition by s.id_piece) as montant_tot_ttc
      FROM stock as s  
           inner join facture as f
             on s.id_piece = f.id_facture 
     where s.id_piece = 15
       and s.type_piece = 'facture';

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour sans les CTe
    Tu peux utiliser une vue qui contiendra Q_detail.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  facture.id_facture,code_article, quantite, prix_vente_ht, taux_tva, 
            (prix_vente_ht * ( 1 +  (taux_tva /100)))     AS prix_vente_ttc,   
            (quantite * prix_vente_ht) AS montant_ht, 
            (quantite * prix_vente_ht) * (1 + (taux_tva/100)) AS montant_ttc
     
            FROM stock  
            INNER JOIN facture ON id_piece = facture.id_facture 
            WHERE id_piece = 15 AND type_piece = 'facture'
    Et la requête devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT D.id_facture,code_article, quantite, prix_vente_ht, taux_tva,prix_vente_ttc,montant_ht,montant_ttc,montant_tot_ttc
    FROM Q_detail D
        INNER JOIN (    SELECT  id_facture , SUM(montant_ttc) AS montant_tot_ttc
                        FROM Q_detail
                        GROUP BY id_facture
                    ) AS T
    ON D.id_facture= T.id_facture
    Sinon sans vue du tout mais en recalculant le montant_ttc en détail et en total tu as
    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
    SELECT D.id_facture,code_article, quantite, prix_vente_ht, taux_tva,prix_vente_ttc,montant_ht,montant_ttc,montant_tot_ttc
    FROM (
            SELECT  facture.id_facture,code_article, 
            quantite, prix_vente_ht, taux_tva, 
            (prix_vente_ht * ( 1 +  (taux_tva /100)))     AS prix_vente_ttc,   
            (quantite * prix_vente_ht) AS montant_ht, 
            (quantite * prix_vente_ht) * (1 + (taux_tva/100)) AS montant_ttc
     
            FROM stock  
            INNER JOIN facture ON id_piece = facture.id_facture 
            WHERE id_piece = 15 AND type_piece = 'facture' 
        )  D
        INNER JOIN (    
                SELECT  id_facture , 
                SUM((quantite * prix_vente_ht) * (1 + (taux_tva/100))) AS montant_tot_ttc
                FROM stock  
                INNER JOIN facture ON id_piece = facture.id_facture 
                WHERE id_piece = 15 AND type_piece = 'facture' 
                GROUP BY id_facture
            ) AS T
        ON D.id_facture= T.id_facture

  10. #10
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Certes, mais l'idée de la fonction de fenêtrage n'est de ne parcourir qu'une fois chaque table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT s.id_piece, s.code_article, s.quantite, s.prix_vente_ht, f.taux_tva, 
           s.prix_vente_ht * (1 + f.taux_tva / 100) as prix_vente_ttc,   
           s.quantite * s.prix_vente_ht as montant_ht, 
           (s.quantite * s.prix_vente_ht) * (1 + f.taux_tva / 100) as montant_ttc
           sum((s.quantite * s.prix_vente_ht) * (1 + f.taux_tva / 100)) over(partition by s.id_piece) as montant_tot_ttc
      FROM stock as s  
           inner join facture as f
             on s.id_piece = f.id_facture 
     where s.id_piece = 15
       and s.type_piece = 'facture';
    Merci Waldar, mais même les fonctions de fenêtrage ne marchent pas non plus (d'après mes essais), il y a le mot clé "over" non reconnu.


    Citation Envoyé par soazig Voir le message
    Sinon sans vue du tout mais en recalculant le montant_ttc en détail et en total tu as
    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
    SELECT D.id_facture,code_article, quantite, prix_vente_ht, taux_tva,prix_vente_ttc,montant_ht,montant_ttc,montant_tot_ttc
    FROM (
            SELECT  facture.id_facture,code_article, 
            quantite, prix_vente_ht, taux_tva, 
            (prix_vente_ht * ( 1 +  (taux_tva /100)))     AS prix_vente_ttc,   
            (quantite * prix_vente_ht) AS montant_ht, 
            (quantite * prix_vente_ht) * (1 + (taux_tva/100)) AS montant_ttc
     
            FROM stock  
            INNER JOIN facture ON id_piece = facture.id_facture 
            WHERE id_piece = 15 AND type_piece = 'facture' 
        )  D
        INNER JOIN (    
                SELECT  id_facture , 
                SUM((quantite * prix_vente_ht) * (1 + (taux_tva/100))) AS montant_tot_ttc
                FROM stock  
                INNER JOIN facture ON id_piece = facture.id_facture 
                WHERE id_piece = 15 AND type_piece = 'facture' 
                GROUP BY id_facture
            ) AS T
        ON D.id_facture= T.id_facture
    Super, Sans vue, ça me va très bien


    Merci à Waldar et soazig.
    Je vais voir si on peut mettre à jours le SGBD.


    Allez, bonne journée

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

Discussions similaires

  1. calcul somme sur une colonne
    Par lepeule dans le forum Langage SQL
    Réponses: 9
    Dernier message: 24/04/2010, 11h11
  2. Réponses: 7
    Dernier message: 25/01/2010, 11h24
  3. Calcul de la somme d'une colonne apres la derniere ligne non vide
    Par lilp1 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/06/2009, 11h14
  4. comment calculer la somme d'une colonne d'un dbgrid
    Par kirty dans le forum Bases de données
    Réponses: 4
    Dernier message: 24/07/2006, 20h55

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