[SQL] requête besoin d'aide

Résolu
jigolo13 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   -  
jigolo13 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai un petit soucis avec un requête SQL. Pour faire simple, je dispose d'une table "inventaire", cette table comprend différents titres financier de différents émetteur.
Dans un premier temps, j'ai récupérer sans soucis les titres d'un émetteur particulier gràce à la requete suivante :


"SELECT code_titre,libellé,date_inventaire, maturité , rating,rating_sp,rating_fitch,rating_moodys,rating_arrco,rating_solv2,rating_récent

FROM table_inventaires

WHERE Emetteur = '" & cb_emet.Text & "' AND maturité >'" & Date.Now.Date & "'

ORDER BY CAST(date_inventaire as datetime) DESC "


(je code en vb.net, d'ou les cb_emet (combobox ou l'utilisateur choisis l'emetteur de titres) et le date.now.date)



Donc comme je disais pour cette requête pas de probleme, sauf que l'on constate que le même titre apparait plusieurs fois, en effet il est rajouté à intervalle régulier dans la base de données donc le meme titre apparait plusieurs fois avec une date d'inventaire différente.
Ce que je cherche à faire, c'est supprimer les doublons, c'est à dire que si un titre apparait plusieurs fois, on ne le conserve qu'une fois (si possible celui à la date d'inventaire la plus récente!)

Voila la requete que j'ai essayé :

"SELECT code_titre,libellé ,date_inventaire ,rating ,rating_sp ,rating_fitch , rating_moodys, rating_arrco, rating_solv2, rating_récent

FROM table_inventaires

WHERE Emetteur = '" & cb_emet.Text & "' AND maturité >'" & Date.Now.Date & "' AND date_inventaire in (select prem.date_inventaire from table_inventaires prem, table_inventaires second where prem.emetteur = '" & cb_emet.Text & "' AND second.emetteur = '" & cb_emet.Text & "' AND prem.code_titre = second.code_titre and cast(prem.date_inventaire AS datetime) > cast(second.date_inventaire AS datetime))

ORDER BY cast(date_inventaire as datetime)")"


Cette requete ne supprime pas les doublons...
Je vois bien qu'il manque queqlue chose, mais je ne vois pas comment spécifier que je veux une date d'inventaire pour chaque code titre différent... si quelqu'un peut m'aider je lui en serait très reconnaissant!

Merci d'avance



3 réponses

Yakuru Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   24
 
Salut,

J'ai lu un peu vite donc je suis pas sur que ça passe, mais si tu rajoutes un DISTINCT après ton SELECT, ça irait pas ?

"SELECT DISTINCT code_titre,libellé,date_inventaire, maturité , rating,rating_sp,rating_fitch,rating_moodys,rating_arrco,rating_solv2,rating_récent

FROM table_inventaires

WHERE Emetteur = '" & cb_emet.Text & "' AND maturité >'" & Date.Now.Date & "'

ORDER BY CAST(date_inventaire as datetime) DESC "


EDIT : En relisant ton post, ma "solution" marchera pas, vu que le distinct se fera également sur les dates, tu auras les mêmes résultats.
0
jigolo13 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   8
 
Non effectivement le distinct ne peut pas marcher dans mon cas précis, merci quand même
0
jigolo13 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   8
 
Vraiment personne?
0
KptnKsk Messages postés 35 Date d'inscription   Statut Membre Dernière intervention   20
 
Le problème c'est que sans la base, c'est dur de faire une requête comme ça.

Sinon le problème semble venir de ton 2eme select, qui va apparemment te sortir qu'une seule date, (donc si tes produits n'ont pas la même date_inventaire que la date sortie dans ton 2eme select, ça ne va pas les afficher en sortie.

Mais si j'ai bien compris, tu veux récupérer les produits en doublon et les supprimer sauf l'entrée la plus récente.
Sinon pour récuperer que la liste des produits, faire le disctinct et enlever date_inventaire du select.
(sinon il y a un double quote en trop a la fin du script : ORDER BY cast(date_inventaire as datetime)")" )
0
jigolo13 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   8
 
Oui c'est tout à fait ça, mais la liste des produits sans la date_inventaire ne supprime pas forcement les doublons car le même titre enregistré à 2 dates différentes peut avoir des ratings différents donc en utilisant le distinct comme tu dis, je peux très bien avoir le même titre qui apparait 2 fois avec des ratings différents, et en plus sans la date d'inventaire, donc très confus...

Ce qu'il faut c'est qu'effectivement chaque titre n'apparaisse qu'une seule fois et ce à sa dernière date_inventaire.
0
KptnKsk Messages postés 35 Date d'inscription   Statut Membre Dernière intervention   20
 
Supprimer de la table ou juste de la requete?

(le problème tu vois c'est que on est pas au courant que les rating peuvent etre différents)

Edit : Et en faisant l'autojointure directement dans ton premier select et en enlevant le 2eme?
0
jigolo13 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   8
 
de la requete. Oui désolé j'ai pas donné tous les infos... mais c'est bon tu sais tout la je crois.

Je viens d'essayer ce que tu m'as conseillé, voila ma requete :

"SELECT prem.code_titre, prem.libellé, prem.date_inventaire, prem.rating, prem.rating_sp, prem.rating_fitch, prem.rating_moodys, prem.rating_arrco, prem.rating_solv2, prem.rating_récent


FROM table_inventaires prem, table_inventaires second


WHERE prem.emetteur = '" & cb_emet.Text & "' AND second.emetteur = '" & cb_emet.Text & "'

AND prem.maturité >'" & Date.Now.Date & "' AND second.maturité >'" & Date.Now.Date & "'

AND prem.code_titre = second.code_titre

AND CAST(prem.date_inventaire AS datetime) >= ALL CAST(second.date_inventaire AS datetime)"

Aparemment le ALL pose probleme, j'ai un message d'erreur qui me dit que la syntaxe est incorrecte vers "CAST". En supprimant le ALL, la requete fonctionne mais ne supprime que le doublons ayant la plus petite date, donc si j'ai 4 fois le meme titre (ce qui est souvent le cas!) et bien seulement celui avec la plus veille date d'inventaire est supprimée...
0
KptnKsk Messages postés 35 Date d'inscription   Statut Membre Dernière intervention   20
 
En supprimant le ALL et mettre > au lieu de >= ?
0