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 :

Calcul avec une sous-requête


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    commercial
    Inscrit en
    Octobre 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2016
    Messages : 26
    Points : 23
    Points
    23
    Par défaut Calcul avec une sous-requête
    Bonjour Je suis à la recherche depuis des heures de la bonne requête.
    Merci pour vos conseils.
    je tente de charger un DATASET depuis une requete, le problème étant la requête.

    J'utilise mysql et en l'occurence deux tables : vente et détail vente.

    La table vente reprend la date et le mode de paiement de la vente
    La table detail vente reprend le détail de cette même vente.

    Est il possible d'écrire une requête qui me permet de soustraire du montant "liquide' de la table vente le montant correspondant avec la table détail vente dont le "id_vente" correspondant et la "controle" égal a zero ?



    Voici ma table detail vente
    que j'obtiens comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT detail_vente.id_detail_vente, detail_vente.id_vente,detail_vente.total, detail_vente.controle from detail_vente INNER JOIN ventes on ventes.id_ventes = detail_vente.id_vente
    WHERE ventes.date_paiement = 20190106
    Nom : Screenshot_2019-03-04 localhost MySQL caisse detail_vente phpMyAdmin 4 7 4.png
Affichages : 482
Taille : 12,4 Ko

    Voici ma table vente
    que j'obtiens comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ventes.id_ventes, ventes.liquide,ventes.date_paiement FROM ventes
    WHERE ventes.date_paiement = 20190106
    Nom : Screenshot_2019-03-04 localhost MySQL caisse detail_vente phpMyAdmin 4 7 4(1).png
Affichages : 464
Taille : 33,8 Ko
    Images attachées Images attachées   

  2. #2
    Membre à l'essai
    Homme Profil pro
    commercial
    Inscrit en
    Octobre 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2016
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    Voici une requete mais qui ne renvoie que sur une seule ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT (A) as ID, SUM(B) as BCT, SUM(C) as Visa, (SUM(D)-(SELECT sum(ventes.liquide) FROM ventes
    INNER JOIN detail_vente on detail_vente.id_vente = ventes.id_ventes
    WHERE ventes.date_vente = 20190106 AND detail_vente.controle = 0)) as Liquide, SUM(E) as Virement,
    (SUM(Total)-(SELECT sum(ventes.liquide) FROM ventes INNER JOIN detail_vente on detail_vente.id_vente =
                 ventes.id_ventes WHERE ventes.date_vente = 20190106 AND detail_vente.controle = 0)) as GrTotal FROM (SELECT
    `id_ventes` AS A,`bancontat` AS B,`visa` AS C,`liquide` AS D,`virement` AS E, (bancontat+visa+liquide+virement) AS
    Total, date_paiement AS F, clients.nom AS G FROM ventes
                INNER Join clients ON clients.id_client = ventes.id_client
                WHERE ventes.date_vente = 20190106) AS fff

  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
    Si votre table detail_vente ne peut avoir qu'une ligne controle 0 par id_vente, vous pouvez faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        select vt.id_ventes
             , vt.liquide
             , vt.date_paiement
             , coalesce(dv.total, 0)              as total_controle_0
             , vt.liquide - coalesce(dv.total, 0) as liquide_2
          from ventes       as vt
     left join detail_vente as dv  on dv.id_vente = vt.id_ventes
                                  and dv.controle = 0
         where vt.date_paiement = date '2019-01-06';

  4. #4
    Membre à l'essai
    Homme Profil pro
    commercial
    Inscrit en
    Octobre 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2016
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    Bonjour et merci pour votre réponse mais ma table detail_vente peut avoir plus d'une ligne avec le même id_vente et le controle 0 ...

    Il faudrait pouvoir faire la somme des controles = a 0 pour le même id_vente ... Est ce que c'est possible ?

    Par contre votre requête fonctionne très bien si je n'ai qu'un seul contrôle a 0 pour le même id_vente

  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
    Au choix,

    Requête ensembliste, à utiliser si vous regardez beaucoup de ventes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        select vt.id_ventes
             , vt.liquide
             , vt.date_paiement
             , coalesce(dv.total, 0)              as total_controle_0
             , vt.liquide - coalesce(dv.total, 0) as liquide_2
          from ventes as vt
     left join ( select id_vente
                      , sum(total) as total
                   from detail_vente
                  where controle = 0
               group by id_vente) as dv on dv.id_vente = vt.id_ventes
         where vt.date_paiement = date '2019-01-06';
    Sous-requête scalaire, à utiliser si vous regardez peu de ventes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select vt.id_ventes
         , vt.liquide
         , vt.date_paiement
         , vt.liquide - coalesce((select sum(dv.total) from detail_vente as dv where dv.id_vente = vt.id_ventes and dv.controle = 0), 0) as liquide_2
      from ventes       as vt
     where vt.date_paiement = date '2019-01-06';

  6. #6
    Membre à l'essai
    Homme Profil pro
    commercial
    Inscrit en
    Octobre 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2016
    Messages : 26
    Points : 23
    Points
    23
    Par défaut Merci 1000 fois
    Je vous remercie infiniment pour votre aide, vous m'avez donné la solution.
    Je suis la dessus depuis des jours avec des requêtes a rallonges qui n'aboutissent pas et ce n'est pas faute de chercher et d'essayer ...

    Merci

    Quelle intérêt a utiliser l'une ou l'autre requête ?

    Merci encore

  7. #7
    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
    C'est indiqué, la première requête sera plus rapide que la seconde si vous regardez beaucoup de ventes - il est difficile de quantifier ce beaucoup de manière empirique.
    La seconde sera plus rapide si vous ne regardez que quelques ventes.

  8. #8
    Membre à l'essai
    Homme Profil pro
    commercial
    Inscrit en
    Octobre 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2016
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    ok bien compris

    et bonne journée

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/10/2008, 18h08
  2. Réponses: 2
    Dernier message: 02/04/2008, 09h59
  3. Check avec une sous-requête
    Par Neal Morse dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 22/03/2008, 22h31
  4. Ordonner avec une sous requête ,possible ou pas?
    Par worm1 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/02/2007, 06h23
  5. Update avec une sous requête
    Par Deejoh dans le forum Installation
    Réponses: 7
    Dernier message: 25/01/2006, 11h50

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