Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/03/2011, 17h52   #1
Invité de passage
 
Inscription : mars 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Par défaut Besoin d'aide !

Bonjour, Étant débutant sur SQL, Je dois effectuer une modification sur une requête existante mais étant donné mon inexpérience, ça fait 3 jours que je suis là dessus et je ne vois pas comment faire pour résoudre mon problème...

Cette requête est utilisée pour sortir le résultat (détail financier) de chaque compte. Sauf que la modification à apporter est de rajouter un champ au niveau détail toujours mais qui doit contenir le nombre de jours selon lequel si le solde du compte est dans le négatif depuis environs 1 semaine, je devrai afficher "7" jours. L'information du solde est dans la table BPSA.v_taccount_balance_histExt (table déjà utilisée pour sortir le détail des comptes). Donc en réalité, avant d'afficher le record d'un compte (l'information détail) je devrais aller lire la même table que je lis présentement et que si le solde du compte est négatif (en date d'aujourd'hui par exemple), je dois lire chaque records précédent (hier, avant hier etc...) pour déterminer depuis combien de jour ce compte a un solde négatif ...

Si quelqu'un pourrait me donner un peu d'information sur comment faire ça, ça serait très aimable car honnêtement, je ne sais même pas par quoi commencer ... Merci Beaucoup.


Exemple de la requête ...
Code :
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
64
65
SELECT    
    crspn_id, crspn_nm,na_line_txt,
    branch_cd + account_cd AS Account,
    CASE WHEN currency_cd = '000' THEN 'CAD' ELSE 'US' END AS "Currency",
    rr_cd,TD_AMT,SD_AMT,market_val_tot_amt,equity_total_amt,
    Sum(equity_total_amt) AS lqdtg_eqty_tot_amt,
    SUM(house_bal_call_amt) AS house_bal_call_amt
 
FROM
(            
    -- *** View Simulation
    SELECT    T5.crspn_id,
        T5.crspn_nm,
        T5.crspn_type_cd,
        T1.client_nbr,
        T1.branch_cd ,
        T1.account_cd,
        T1.currency_cd,
                          T3.na_line_txt,
        T1.cash_bal_call_amt,
        T1.house_bal_call_amt ,
        T1.mmf_avlbl_ytdy_amt,
        T1.market_val_tot_amt ,
        T1.equity_total_amt ,
        T1.lqdtg_eqty_tot_amt ,
        T1.dytrd_call_amt,
        T2.rr_cd,
        (Sum(T2.ydys_trade_dt_amt)*-1) AS TD_AMT,
        (Sum(T2.ydys_settlm_dt_amt)*-1) AS SD_AMT
    FROM BPSA.v_taccount_balance_histExt AS T1
    ----Link acount balances with accoutn types  T2
    INNER JOIN BPSA.v_tacc_type_balance_histExt AS T2 ON T2.client_nbr = T1.client_nbr AND T2.branch_cd = T1.branch_cd AND T2.account_cd = T1.account_cd AND T2.currency_cd = T1.currency_cd AND '2011-03-22' >= T2.business_date AND '2011-03-22' < T2.business_validto_date
    ----Link Account balances with Name description T3
    LEFT JOIN BPSA.v_tacc_party_ff_na_histExt AS T3 ON T2.client_nbr = T2.client_nbr AND T2.account_cd = T3.account_cd AND T2.branch_cd=T3.branch_cd AND T3.na_line_seq_nbr = 1 AND T3.ap_seq_nbr = 1 AND '2011-03-22' >= T3.business_date AND '2011-03-22' < T3.business_validto_date
    ------link Account balances with Correspondant description T5
    LEFT JOIN BPSA.v_tcrspn_br_acct_histExt AS T4 ON T1.client_nbr = T4.client_nbr AND T1.branch_cd BETWEEN T4.crspn_br_strt_cd AND T4.crspn_br_end_cd AND T1.account_cd BETWEEN T4.crspn_acct_strt_cd AND T4.crspn_acct_end_cd  AND '2011-03-22' >= T4.business_date AND '2011-03-22' < T4.business_validto_date
    ------LINK    T5
LEFT JOIN BPSA.v_tcrspn_info_histExt AS T5 ON t4.client_nbr = T5.client_nbr AND T4.crspn_id = T5.crspn_id  AND '2011-03-22' >= T5.business_date AND '2011-03-22' < T5.business_validto_date
 
WHERE    T1.client_nbr = '0053' AND
        ((T1.currency_cd = '000') OR (T1.currency_cd = '001')) AND
        T2.type_account_cd = '1' AND
        T5.crspn_rprt_cd <> 'N' AND (t1.branch_cd BETWEEN  '200' AND '449' OR t1.branch_cd BETWEEN  '700' AND '799') AND ('2011-03-22' >= T1.business_date AND '2011-03-22' < T1.business_validto_date)
    GROUP BY T5.crspn_id,
         T5.crspn_nm,
         T5.crspn_type_cd,
         T1.client_nbr,
         T1.branch_cd ,
         T1.account_cd,
         T1.currency_cd,
         T3.na_line_txt,
         T1.cash_bal_call_amt,
         T1.house_bal_call_amt ,
         T1.mmf_avlbl_ytdy_amt,
         T1.market_val_tot_amt ,
         T1.equity_total_amt ,
         T1.lqdtg_eqty_tot_amt ,
         T1.dytrd_call_amt,
         T2.rr_cd
) TOP1
WHERE TD_AMT < 0 AND SD_AMT < 0 AND house_bal_call_amt = 0
GROUP BY crspn_id, crspn_nm,na_line_txt,equity_total_amt,
     branch_cd,
     account_cd,currency_cd,rr_cd,TD_AMT,SD_AMT,market_val_tot_amt
ORDER BY crspn_nm, SD_AMT DESC
sqlsteph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 08h35   #2
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

Ta requête est illisible. Je n'ai pas la compétence pour t'aider dans une requête aussi complexe, mais il me semble que si tu veux des réponses, il est nécessaire :
  • D'expliquer l'objet de cette requête
  • De fournir le détail des tables concernées
  • Indique les modifications que tu veux apporter
  • Essai de présenter le code de ta requête en respectant la chartre du forum
Sinon, je pense que tu n'auras pas beaucoup de candidats. N'oublies pas que ceux qui répondent le font sur leurs loisirs. Alors, il faut leur faciliter un peu la tâche.

Bon, j'ai décidé de mettre en forme lisible ta requête
Code :
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
SELECT 
   T5.crspn_id,
   T5.crspn_nm,
   T5.crspn_type_cd,
   T1.client_nbr,
   T1.branch_cd ,
   T1.account_cd,
   T1.currency_cd,
   T3.na_line_txt,
   T1.cash_bal_call_amt,
   T1.house_bal_call_amt ,
   T1.mmf_avlbl_ytdy_amt,
   T1.market_val_tot_amt ,
   T1.equity_total_amt ,
   T1.lqdtg_eqty_tot_amt ,
   T1.dytrd_call_amt,
   T2.rr_cd,
   (Sum(T2.ydys_trade_dt_amt)*-1) AS TD_AMT,
   (Sum(T2.ydys_settlm_dt_amt)*-1) AS SD_AMT
FROM BPSA.v_taccount_balance_histExt AS T1
  /* Link acount balances with accoutn types T2 */
  INNER JOIN BPSA.v_tacc_type_balance_histExt AS T2 ON T2.client_nbr = T1.client_nbr AND T2.branch_cd = T1.branch_cd AND T2.account_cd = T1.account_cd AND T2.currency_cd = T1.currency_cd 
     AND '2011-03-22' >= T2.business_date AND '2011-03-22' < T2.business_validto_date
  /* Link Account balances with Name description T3 */
  LEFT JOIN BPSA.v_tacc_party_ff_na_histExt AS T3 ON T2.client_nbr = T2.client_nbr AND T2.account_cd = T3.account_cd AND T2.branch_cd=T3.branch_cd AND T3.na_line_seq_nbr = 1 AND T3.ap_seq_nbr = 1   AND '2011-03-22' >= T3.business_date AND '2011-03-22' < T3.business_validto_date
  /* Link Account balances with Correspondant description T5 */
  LEFT JOIN BPSA.v_tcrspn_br_acct_histExt AS T4 ON T1.client_nbr = T4.client_nbr AND T1.branch_cd BETWEEN T4.crspn_br_strt_cd AND T4.crspn_br_end_cd AND T1.account_cd BETWEEN T4.crspn_acct_strt_cd   AND T4.crspn_acct_end_cd AND '2011-03-22' >= T4.business_date AND '2011-03-22' < T4.business_validto_date
  /* LINK T5 */
  LEFT JOIN BPSA.v_tcrspn_info_histExt AS T5 ON t4.client_nbr = T5.client_nbr AND T4.crspn_id = T5.crspn_id AND '2011-03-22' >= T5.business_date AND '2011-03-22' < T5.business_validto_date
 
WHERE 
  T1.client_nbr = '0053' AND ((T1.currency_cd = '000') OR (T1.currency_cd = '001')) AND T2.type_account_cd = '1' 
  AND T5.crspn_rprt_cd <> 'N' AND (t1.branch_cd BETWEEN '200' AND '449' OR t1.branch_cd BETWEEN '700' AND '799') 
  AND ('2011-03-22' >= T1.business_date AND '2011-03-22' < T1.business_validto_date)
  GROUP BY 
     T5.crspn_id,
     T5.crspn_nm,
     T5.crspn_type_cd,
     T1.client_nbr,
     T1.branch_cd ,
     T1.account_cd,
     T1.currency_cd,
     T3.na_line_txt,
     T1.cash_bal_call_amt,
     T1.house_bal_call_amt ,
     T1.mmf_avlbl_ytdy_amt,
     T1.market_val_tot_amt ,
     T1.equity_total_amt ,
     T1.lqdtg_eqty_tot_amt ,
     T1.dytrd_call_amt,
     T2.rr_cd) TOP1
/* Note ajoutée - Cette partie appartient à la requête initiale ? */	 
WHERE TD_AMT < 0 AND SD_AMT < 0 AND house_bal_call_amt = 0
GROUP BY crspn_id, crspn_nm,na_line_txt,equity_total_amt, branch_cd, account_cd,currency_cd,rr_cd,TD_AMT,SD_AMT,market_val_tot_amt
ORDER BY crspn_nm, SD_AMT DESC
Sauf erreur de ma part, elle comprend 2 instructions WHERE, pourquoi ?
Il serait bon de vérifier si le modèle fourni est exact.

A+
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 10h18   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par seabs Voir le message
Sauf erreur de ma part, elle comprend 2 instructions WHERE, pourquoi ?
Le premier WHERE est dans la sous-requête complexe qui commence juste après le FROM et qui finit juste avant son alias TOP1. Le second WHERE est pour la requête principale.

Mais effectivement, c'est difficile d'analyser une requête aussi complexe.

J'ai moi aussi remis en forme la requête :
Code :
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
SELECT    
    crspn_id, crspn_nm, na_line_txt,
    branch_cd + account_cd AS Account,
    CASE 
        WHEN currency_cd = '000' THEN 'CAD' 
        ELSE 'US' 
    END AS "Currency",
    rr_cd, TD_AMT, SD_AMT, market_val_tot_amt, equity_total_amt,
    SUM(equity_total_amt) AS lqdtg_eqty_tot_amt,
    SUM(house_bal_call_amt) AS house_bal_call_amt
 
FROM
(            
    -- *** View Simulation
    SELECT T5.crspn_id,
        T5.crspn_nm,
        T5.crspn_type_cd,
        T1.client_nbr,
        T1.branch_cd ,
        T1.account_cd,
        T1.currency_cd,
        T3.na_line_txt,
        T1.cash_bal_call_amt,
        T1.house_bal_call_amt ,
        T1.mmf_avlbl_ytdy_amt,
        T1.market_val_tot_amt ,
        T1.equity_total_amt ,
        T1.lqdtg_eqty_tot_amt ,
        T1.dytrd_call_amt,
        T2.rr_cd,
        SUM(T2.ydys_trade_dt_amt) * -1 AS TD_AMT,
        SUM(T2.ydys_settlm_dt_amt) * -1 AS SD_AMT
    FROM BPSA.v_taccount_balance_histExt AS T1
    ----Link acount balances with accoutn types  T2
    INNER JOIN BPSA.v_tacc_type_balance_histExt AS T2 
        ON T2.client_nbr = T1.client_nbr 
        AND T2.branch_cd = T1.branch_cd 
        AND T2.account_cd = T1.account_cd 
        AND T2.currency_cd = T1.currency_cd 
        AND '2011-03-22' >= T2.business_date 
        AND '2011-03-22' < T2.business_validto_date
        ----Link Account balances with Name description T3
        LEFT JOIN BPSA.v_tacc_party_ff_na_histExt AS T3 
            ON T2.client_nbr = T2.client_nbr 
            AND T2.account_cd = T3.account_cd 
            AND T2.branch_cd=T3.branch_cd 
            AND T3.na_line_seq_nbr = 1 
            AND T3.ap_seq_nbr = 1 
            AND '2011-03-22' >= T3.business_date 
            AND '2011-03-22' < T3.business_validto_date
    ------link Account balances with Correspondant description T5
    LEFT JOIN BPSA.v_tcrspn_br_acct_histExt AS T4 
        ON T1.client_nbr = T4.client_nbr 
        AND T1.branch_cd BETWEEN T4.crspn_br_strt_cd AND T4.crspn_br_end_cd 
        AND T1.account_cd BETWEEN T4.crspn_acct_strt_cd AND T4.crspn_acct_end_cd  
        AND '2011-03-22' >= T4.business_date 
        AND '2011-03-22' < T4.business_validto_date
    ------LINK    T5
        LEFT JOIN BPSA.v_tcrspn_info_histExt AS T5 
            ON t4.client_nbr = T5.client_nbr 
            AND T4.crspn_id = T5.crspn_id  
            AND '2011-03-22' >= T5.business_date 
            AND '2011-03-22' < T5.business_validto_date
 
    WHERE T1.client_nbr = '0053' 
        AND (T1.currency_cd = '000' OR T1.currency_cd = '001') 
        AND T2.type_account_cd = '1' 
        AND T5.crspn_rprt_cd <> 'N' 
        AND (t1.branch_cd BETWEEN  '200' AND '449' OR t1.branch_cd BETWEEN '700' AND '799') 
        AND ('2011-03-22' >= T1.business_date AND '2011-03-22' < T1.business_validto_date)
    GROUP BY T5.crspn_id,
         T5.crspn_nm,
         T5.crspn_type_cd,
         T1.client_nbr,
         T1.branch_cd ,
         T1.account_cd,
         T1.currency_cd,
         T3.na_line_txt,
         T1.cash_bal_call_amt,
         T1.house_bal_call_amt ,
         T1.mmf_avlbl_ytdy_amt,
         T1.market_val_tot_amt ,
         T1.equity_total_amt ,
         T1.lqdtg_eqty_tot_amt ,
         T1.dytrd_call_amt,
         T2.rr_cd
) TOP1
WHERE TD_AMT < 0 
    AND SD_AMT < 0 
    AND house_bal_call_amt = 0
GROUP BY crspn_id, 
    crspn_nm,
    na_line_txt,
    equity_total_amt,
    branch_cd,
    account_cd,
    currency_cd,
    rr_cd,
    TD_AMT,
    SD_AMT,
    market_val_tot_amt
ORDER BY crspn_nm, SD_AMT DESC
Pas le temps d'en faire davantage.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 12h14   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Effectivement, pas facile à comprendre tous les liens, et modifier la requête en elle même, mais si tu es dessus depuis 3 jours, je pense qu'une piste te suffira pour l'adapter :

Ne va pas chercher le jour précédent, puis le jour d'avant...
Va chercher (si le solde du jour est négatif), le max(JOUR), inférieur à la date du jour, pour lequel le solde est positif, et fais la différence avec la date du jour.
ou pour reformuler :
Si le solde est négatif, va chercher à quelle date il a été positif pour la dernière fois, et compte le nombre de jours entre les deux dates

Sur le principe
Code SQL :
SELECT ..., CASE WHEN Solde >= 0 THEN 0 ELSE SELECT DATEDIFF(DAY,MAX(M.Dateheure), P.DateHeure) FROM MaTable M WHERE Solde >=0 AND M.idDuCompte = P.idDuCompte END FROM ... MaTable P


Bon, c'est un peu moche, mais c'est pour illustrer
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 15h11   #5
Invité de passage
 
Inscription : mars 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Je vous remercie énormément pour votre aide .... Je vais prendre vos conseils et essayer de faire quelque chose de bon avec ça ...

Et désolé du "formatage" de la requête ... Je l'avais laissée telle quelle car je pensais que ça serait plus facile a lire (Je suis vraiment débutant)

Merci encore et si je réussis a résoudre mon problème, je viendrai afficher la requête.

Merci.

Steph.
sqlsteph est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h01.


 
 
 
 
Partenaires

Hébergement Web