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

MS SQL Server Discussion :

SQL: Requête trop compliquée


Sujet :

MS SQL Server

  1. #1
    Membre habitué Avatar de GodGives
    Inscrit en
    Août 2007
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2007
    Messages : 456
    Points : 161
    Points
    161
    Par défaut SQL: Requête trop compliquée
    Bonsoir à tous!

    croyez-moi, je suis sur cette requête depuis une semaine sans résultat escompté.


    je dispose de deux tables:

    FACTURES [numfact, datefact, montfact, #numregl]

    REGLEMENTS [numregl, dateregl, refcheque]

    J'aimerais construire un état , qui me permettra d'avoir à une date donnée, le montant des factures de cette journée, le montant des factures réglées ce jour et le reste à régler jusqu'à ce jour:

    -------------------------------------------------------------------------
    Date-----------Montant Factures------Factures Réglées-----Reste à Régler
    -------------------------------------------------------------------------

    01/05/2010-------- 1 000 000-------------- 700 000------------300 000


    02/05/2010----------1 200 000------------1 400 000------------100 000


    03/05/2010-----------------------------------------------------100 000




    C'est tout ce que je désire avoir depuis une semaine.

    Merci d'avance pour votre aide!!!
    Les problèmes les plus complexes requièrent parfois les solutions les plus simples ...
    ________________________________________________________________________________________________________________________________________
    "Le plus fort n'est jamais assez fort pour être le maître, s'il ne transforme pas sa force en droit et son obéissance en devoir." J.J. Rousseau

  2. #2
    Membre régulier Avatar de SetaSensei
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 104
    Points
    104
    Par défaut
    Bonjour,

    Je vous invite à vous renseigner sur différentes possibilités avec SQL Server 2005 telles que


    Pour vous donner une piste, vous pouvez récupérer simplement la liste complète des montants facturés ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select
    datefact,
    sum(montfact)
    from FACTURES 
    group by datefact

  3. #3
    Membre habitué Avatar de GodGives
    Inscrit en
    Août 2007
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2007
    Messages : 456
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par SetaSensei Voir le message
    Pour vous donner une piste, vous pouvez récupérer simplement la liste complète des montants facturés ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select
    datefact,
    sum(montfact)
    from FACTURES 
    group by datefact
    le montant facturé par jour ainsi que le montant des règlements par jour, ne posent aucun problème!
    Le souci, c'est comment calculer le reste à payer!
    Les problèmes les plus complexes requièrent parfois les solutions les plus simples ...
    ________________________________________________________________________________________________________________________________________
    "Le plus fort n'est jamais assez fort pour être le maître, s'il ne transforme pas sa force en droit et son obéissance en devoir." J.J. Rousseau

  4. #4
    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
    Un petit jeu de test, la requête où vous en êtes ainsi que votre version de SQL Server sont les bienvenus (ça permet de répondre plus rapidement) !

  5. #5
    Membre habitué Avatar de GodGives
    Inscrit en
    Août 2007
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2007
    Messages : 456
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Un petit jeu de test, la requête où vous en êtes ainsi que votre version de SQL Server sont les bienvenus (ça permet de répondre plus rapidement) !
    SQL Server 2000!

    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
    select datefact as d_date, mont, regl
    from 
    (select datefact as d_date, sum(montfact) as mont
    from factures
    group by datefact) fact
    left outer join
    (select dateregl, sum(montfact) as regl
    from factures f, reglements r
    where f.numregl=r.numregl
    group by dateregl) regl
    on datefact=dateregl
     
    union
     
    select datregl as d_date, 0 as mont, regl
    from 
    (select dateregl, sum(montfact) as regl
    from factures f, reglements r
    where f.numregl=r.numregl
    group by dateregl) regl
    where dateregl not in
    (select distinct datefact from factures)
    Cette requête me permet juste d'avoir le total facturé par jour et le total réglé par jour.
    Par contre, je n'arrive pas à trouver la requête qui me me permet d'avoir le reste à payer d'une date à une autre.
    Les problèmes les plus complexes requièrent parfois les solutions les plus simples ...
    ________________________________________________________________________________________________________________________________________
    "Le plus fort n'est jamais assez fort pour être le maître, s'il ne transforme pas sa force en droit et son obéissance en devoir." J.J. Rousseau

  6. #6
    Membre régulier Avatar de SetaSensei
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 104
    Points
    104
    Par défaut
    En parlant de jeu de test, Waldar parlait d'avoir une partie des données que vous utilisez (ou en tout cas, un jeu approchant) afin de plus facilemetn cerner la façon de requêter.

  7. #7
    Membre habitué Avatar de GodGives
    Inscrit en
    Août 2007
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2007
    Messages : 456
    Points : 161
    Points
    161
    Par défaut
    Excusez-moi donc, j'avais pas bien compris.
    Sous quelle forme voulez-vous avoir ces données? un petit exemple, stp, Seta
    Les problèmes les plus complexes requièrent parfois les solutions les plus simples ...
    ________________________________________________________________________________________________________________________________________
    "Le plus fort n'est jamais assez fort pour être le maître, s'il ne transforme pas sa force en droit et son obéissance en devoir." J.J. Rousseau

  8. #8
    Membre régulier Avatar de SetaSensei
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 104
    Points
    104
    Par défaut
    Eh bien idéalement sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    declare @FACTURES table (...)
    declare @...
     
    insert into @FACTURES (...) values (...)
    Mais sinon un résultat de select sur chaque table est acceptable.

  9. #9
    Membre habitué Avatar de GodGives
    Inscrit en
    Août 2007
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2007
    Messages : 456
    Points : 161
    Points
    161
    Par défaut
    table FACTURES
    6100 2010-05-16 00:00:00 767000 36
    6101 2010-05-16 00:00:00 120360 36
    6102 2010-05-16 00:00:00 120360 36
    6103 2010-05-16 00:00:00 120360 36
    6104 2010-05-16 00:00:00 495600 36
    6105 2010-05-16 00:00:00 354000 36
    6106 2010-05-16 00:00:00 354000 36
    6107 2010-05-16 00:00:00 495600 36
    6108 2010-05-16 00:00:00 324500 36
    6110 2010-05-18 00:00:00 317420 NULL
    6111 2010-05-18 00:00:00 380904 NULL
    6112 2010-05-18 00:00:00 380904 NULL
    6113 2010-05-18 00:00:00 444388 NULL
    6114 2010-05-18 00:00:00 444388 NULL
    6115 2010-05-18 00:00:00 380904 NULL
    6116 2010-05-18 00:00:00 526988 NULL
    6117 2010-05-18 00:00:00 354000 NULL
    6118 2010-05-18 00:00:00 354000 NULL
    6119 2010-05-18 00:00:00 354000 NULL
    6120 2010-05-18 00:00:00 120360 NULL
    6121 2010-05-18 00:00:00 120360 NULL
    6122 2010-05-18 00:00:00 120360 NULL
    6123 2010-05-18 00:00:00 120360 NULL
    6124 2010-05-18 00:00:00 120360 NULL
    6125 2010-05-18 00:00:00 120360 NULL
    6126 2010-05-18 00:00:00 120360 NULL
    6127 2010-05-18 00:00:00 120360 NULL
    6128 2010-05-18 00:00:00 120360 NULL
    6129 2010-05-18 00:00:00 120360 NULL
    6130 2010-05-18 00:00:00 120360 NULL
    6131 2010-05-18 00:00:00 120360 NULL
    6132 2010-05-18 00:00:00 120360 NULL
    6133 2010-05-18 00:00:00 120360 NULL
    6134 2010-05-18 00:00:00 120360 NULL
    6135 2010-05-18 00:00:00 120360 NULL
    6136 2010-05-18 00:00:00 120360 NULL
    6137 2010-05-18 00:00:00 120360 NULL
    6138 2010-05-18 00:00:00 120360 NULL
    6139 2010-05-18 00:00:00 120360 NULL
    6140 2010-05-18 00:00:00 120360 NULL

    table REGLEMENTS
    1 2010-01-27 00:00:00 F 2008B 2640
    2 2010-01-27 00:00:00 CB 973320906
    3 2010-02-02 00:00:00 CB 973329865
    4 2010-02-03 00:00:00 F 2008B 5530
    5 2010-02-08 00:00:00 CB 068672144
    6 2010-02-10 00:00:00 F 2008B/3735
    7 2010-02-15 00:00:00 CB 973326498
    8 2010-02-17 00:00:00 F 2008B 9530
    9 2010-02-23 00:00:00 CB 973417463
    10 2010-02-24 00:00:00 F 2008B/1550
    11 2010-03-02 00:00:00 CB 973415643
    12 2010-03-03 00:00:00 F 2008B/5562
    13 2010-03-09 00:00:00 CB 866108438
    14 2010-03-10 00:00:00 F 2008B/9800
    15 2010-03-16 00:00:00 CB 866108968
    16 2010-03-17 00:00:00 F 2008B/8100
    17 2010-03-24 00:00:00 F 2008B 0690
    18 2010-03-23 00:00:00 CB 068661649
    19 2010-03-30 00:00:00 CB 068682544
    20 2010-03-31 00:00:00 F 2008B/5613
    21 2010-04-07 00:00:00 CB 866031064
    22 2010-04-07 00:00:00 F 2008B 2460
    23 2010-04-12 00:00:00 BOA 97332802
    24 2010-04-14 00:00:00 ECO 83521470
    25 2010-04-19 00:00:00 CB 068682880
    26 2010-04-20 00:00:00 CB 835228910
    27 2010-04-26 00:00:00 BOA 97335028
    28 2010-04-28 00:00:00 ECO 83521638
    29 2010-05-05 00:00:00 CB 835222886
    30 2010-05-05 00:00:00 CB 973494648
    31 2010-05-12 00:00:00 CB 866102014
    32 2010-05-15 00:00:00 CB 835228061
    33 2010-05-18 00:00:00 CB 973391211
    34 2010-05-19 00:00:00 CB 835220520
    35 2010-05-26 00:00:00 CB 973391645
    36 2010-05-26 00:00:00 CB 835229200

    J'ai juste pris 40 lignes de la table FACTURES parsque j'ai des milliers de lignes. Merci de demander plus de détails si c'est nécessaire.
    Les problèmes les plus complexes requièrent parfois les solutions les plus simples ...
    ________________________________________________________________________________________________________________________________________
    "Le plus fort n'est jamais assez fort pour être le maître, s'il ne transforme pas sa force en droit et son obéissance en devoir." J.J. Rousseau

  10. #10
    Membre régulier Avatar de SetaSensei
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 104
    Points
    104
    Par défaut
    Juste une question un peu plus fonctionnelle pour bien comprendre : un règlement implique toujours le paiement complet de la facture ?
    Sinon il manque une table référençant le chèque et la valeur de celui-ci.
    Si ce n'est pas le cas, j'ai juste besoin de la précision, merci.

  11. #11
    Membre habitué Avatar de GodGives
    Inscrit en
    Août 2007
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2007
    Messages : 456
    Points : 161
    Points
    161
    Par défaut
    dans la table REGLEMENTS, j'ai le numéro du règlement, la date et la référence du chèque.
    Un chèque peut régler une ou plusieurs factures, toujours en intégralité.
    Les problèmes les plus complexes requièrent parfois les solutions les plus simples ...
    ________________________________________________________________________________________________________________________________________
    "Le plus fort n'est jamais assez fort pour être le maître, s'il ne transforme pas sa force en droit et son obéissance en devoir." J.J. Rousseau

  12. #12
    Membre régulier Avatar de SetaSensei
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 104
    Points
    104
    Par défaut
    Voilà une solution possible en passant par des variables table.

    Il y a sûrement plus optimisé faisable en une requête, mais bon, voilà déjà une piste.

    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
     
    -- Total par jour de mes factures
    declare @tableSum table (dateFacts datetime, montFactSum int)
    insert into @tableSum
    select
    	datefact,
    	sum(montfact)
    from
    	@FACTURES
    group by
    	datefact
     
    -- Total par jour des factures payées
    declare @tablePayed table (dateFacts datetime, montFactSum int)
    insert into @tablePayed
    select
    	datefact,
    	sum(montfact)
    from
    	@FACTURES
    where
    	numregl is not null
    group by
    	datefact
     
    -- Total par jour des factures non payées
    declare @tableTotalNonPayes table (dateFacts datetime, montFactTotalToPay int)
    insert into @tableTotalNonPayes
    select
    	datefact,
    	isnull(sum(montfact), 0)
    from
    	@FACTURES
    where
    	numregl is null
    group by
    	datefact
     
    -- reste à régler jusqu'à ce jour
    declare @tableTotalToPay table (dateFacts datetime, montFactTotal int)
    insert into @tableTotalToPay
    select
    	a.dateFacts,
    	a.montFactTotalToPay +	isnull(sum(b.montFactTotalToPay), 0)
    from
    	@tableTotalNonPayes a left join
    	@tableTotalNonPayes b on b.dateFacts < a.dateFacts
    group by
    	a.dateFacts
    	,a.montFactTotalToPay
     
     
    select * from @tableTotalToPay
     
    select
    	a.dateFacts,
    	isnull(a.montFactSum, 0) as 'Montant Factures',
    	isnull(b.montFactSum, 0) as 'Factures Réglées',
    	isnull(c.montFactTotal, 0) as 'Reste à Régler'
    from
    	@tableSum a left join
    	@tablePayed b on b.dateFacts = a.dateFacts left join
    	@tableTotalToPay c on c.dateFacts = a.dateFacts

  13. #13
    Membre habitué Avatar de GodGives
    Inscrit en
    Août 2007
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2007
    Messages : 456
    Points : 161
    Points
    161
    Par défaut
    Cette requête nous donne seulement le montant des impayés à la date d'aujourd'hui. avec cela, on ne peut pas réaliser le tableau demandé.
    un petit exemple:

    01 Mai 2010: Facturé: 1 000 000, Payé: 700 000, Reste: 300 000
    02 Mai 2010: Facturé: 800 000, Payé: 900 000, Reste: 200 000.


    dans les 900 000 payés le 02 mai, on a réglé 200 000 des 300 000 qui reste le 01 mai, et et 700 000 des 800 000 qui ont été facturé le 02 Mai.

    par contre, la requête qui est en haut, nous permet juste de dire que au 01 mai, il reste 100 000 à payer et au 02 mai, il reste aussi 100 000.

    C'est à partir de là, que ça devient un peu compliqué.
    Les problèmes les plus complexes requièrent parfois les solutions les plus simples ...
    ________________________________________________________________________________________________________________________________________
    "Le plus fort n'est jamais assez fort pour être le maître, s'il ne transforme pas sa force en droit et son obéissance en devoir." J.J. Rousseau

Discussions similaires

  1. [AC-2003] Requête trop compliquée
    Par PAUL87 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 18/12/2011, 15h43
  2. Mes requêtes SQL sont trop lentes
    Par Pgs dans le forum Langage SQL
    Réponses: 11
    Dernier message: 23/06/2008, 07h48
  3. Requête SQL trop compliquée pour moi
    Par goldenboy68 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/04/2008, 14h50
  4. [SQL] Requête SQL trop compliquée pour lui.
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 23/05/2006, 22h52
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 15h17

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