suppression doublon les moins récents

Petit nouveau ! | 1 Messages

08 févr. 2013, 12:20

Bonjour!!
Je vous explique mon problème, je débute avec le SQL et ma boite aimerai que je supprime les doublons les plus anciens (DATEATT) qui sont sur le GA_CODEARTICLE.
Je n'arrive pas à m'en sortir... Je travail sur SQL-SERVER 2008
Voici la requete :
12345678910111213141516171819202122 SELECT     TOP (100) PERCENT dbo.ARTICLE.GA_CODEARTICLE AS Code, dbo.ARTICLE.GA_LIBELLE AS Libellé, dbo.ARTICLE.GA_QUALIFUNITESTO AS Cond, 
                      dbo.ZW_TGD.YTS_PRIXNET AS TGD, dbo.ZW_T000.YTS_PRIXNET AS Tarif, dbo.ARTICLE.GA_VALLIBRE1 AS Planc, dbo.ZW_TDES.YTS_PRIXNET AS Desto, 
                      dbo.DISPO.GQ_PHYSIQUE - dbo.DISPO.GQ_RESERVECLI AS Dispo, dbo.ZW_DATERECEPART.DATEATT AS [D. Arriv], 
                      dbo.ZW_ETAT_CONTAINER.RDD_RDDLIBTABLE1 AS S, dbo.ZWL_STOCKARTA.QDISPOP AS Réser, 
                      dbo.ZWL_STOCKARTA.QATT + dbo.ZWL_STOCKARTA.QDISPO AS Solde, dbo.ZW_TDET.YTS_PRIXNET AS Détail, dbo.CHOIXEXT.YX_LIBELLE AS Statut, 
                      dbo.ZW_DATERECEPART.qtecartons AS [Arr.]
FROM         dbo.ZW_TDET INNER JOIN
                      dbo.ARTICLE INNER JOIN
                      dbo.ZW_T000 ON dbo.ARTICLE.GA_ARTICLE = dbo.ZW_T000.YTS_ARTICLE INNER JOIN
                      dbo.DISPO ON dbo.ARTICLE.GA_ARTICLE = dbo.DISPO.GQ_ARTICLE ON dbo.ZW_TDET.YTS_ARTICLE = dbo.ARTICLE.GA_ARTICLE INNER JOIN
                      dbo.CHOIXEXT ON dbo.ARTICLE.GA_LIBREART1 = dbo.CHOIXEXT.YX_CODE LEFT OUTER JOIN
                      dbo.ZW_TGD ON dbo.ARTICLE.GA_ARTICLE = dbo.ZW_TGD.YTS_ARTICLE LEFT OUTER JOIN
                      dbo.ZW_DATERECEPART INNER JOIN
                      dbo.ZW_ETAT_CONTAINER ON dbo.ZW_DATERECEPART.Expr1 = dbo.ZW_ETAT_CONTAINER.GP_NUMERO ON 
                      dbo.ARTICLE.GA_ARTICLE = dbo.ZW_ETAT_CONTAINER.GLARTICLE AND dbo.ARTICLE.GA_ARTICLE = dbo.ZW_DATERECEPART.ARTICLE LEFT OUTER JOIN
                      dbo.CATALOGU ON dbo.ARTICLE.GA_ARTICLE = dbo.CATALOGU.GCA_ARTICLE AND dbo.ARTICLE.GA_FOURNPRINC = dbo.CATALOGU.GCA_TIERS LEFT OUTER JOIN
                      dbo.ZWL_STOCKARTA ON dbo.ARTICLE.GA_ARTICLE = dbo.ZWL_STOCKARTA.QARTICLE LEFT OUTER JOIN
                      dbo.ZW_TDES ON dbo.ARTICLE.GA_ARTICLE = dbo.ZW_TDES.YTS_ARTICLE
WHERE     (dbo.DISPO.GQ_DEPOT = 'C') AND (dbo.ARTICLE.GA_FERME = '-') AND (dbo.ZWL_STOCKARTA.QATT <> 0) AND (dbo.ZW_DATERECEPART.qtecartons <> 0) OR
                      (dbo.DISPO.GQ_DEPOT = 'C') AND (dbo.ARTICLE.GA_FERME = '-') AND (LEFT(dbo.ARTICLE.GA_CODEARTICLE, 1) <> 'a') AND (LEFT(dbo.ARTICLE.GA_CODEARTICLE, 1) 
                      <> 'b') AND (LEFT(dbo.ARTICLE.GA_CODEARTICLE, 1) <> 'w') AND (dbo.DISPO.GQ_PHYSIQUE - dbo.DISPO.GQ_RESERVECLI > 0)
ORDER BY Code 
Merci pour votre aide!!
Romain

Mammouth du PHP | 19672 Messages

08 févr. 2013, 19:57

Salut, ta question est un peu incomplète : tu n'y arrives pas, bon, ok, mais tu obtiens quoi ? Un message d'erreur ? Rien ? Et pour qu'on sache comment orienter éventuellement la réponse, tu attends quoi à la place du résultat actuel ?

Quoi qu'il en soit, je viens de jeter un coup d’œil à ta requête. Il y a peut-être un problème dans les jointures. En réalignant tout ça proprement histoire d'arriver à lire, voici une suggestion de correction :
SELECT
    TOP (100) PERCENT dbo.ARTICLE.GA_CODEARTICLE        AS Code,
    dbo.ARTICLE.GA_LIBELLE                              AS Libellé,
    dbo.ARTICLE.GA_QUALIFUNITESTO                       AS Cond,
    dbo.ZW_TGD.YTS_PRIXNET                              AS TGD,
    dbo.ZW_T000.YTS_PRIXNET                             AS Tarif,
    dbo.ARTICLE.GA_VALLIBRE1                            AS Planc,
    dbo.ZW_TDES.YTS_PRIXNET                             AS Desto,
    (dbo.DISPO.GQ_PHYSIQUE - dbo.DISPO.GQ_RESERVECLI)   AS Dispo,
    dbo.ZW_DATERECEPART.DATEATT                         AS [D. Arriv],
    dbo.ZW_ETAT_CONTAINER.RDD_RDDLIBTABLE1              AS S,
    dbo.ZWL_STOCKARTA.QDISPOP                           AS Réser,
    (dbo.ZWL_STOCKARTA.QATT + dbo.ZWL_STOCKARTA.QDISPO) AS Solde,
    dbo.ZW_TDET.YTS_PRIXNET                             AS Détail,
    dbo.CHOIXEXT.YX_LIBELLE                             AS Statut,
    dbo.ZW_DATERECEPART.qtecartons                      AS [Arr.]
FROM dbo.ZW_TDET
    INNER JOIN dbo.ARTICLE              ON dbo.ZW_TDET.YTS_ARTICLE    = dbo.ARTICLE.GA_ARTICLE
    INNER JOIN dbo.ZW_T000              ON dbo.ARTICLE.GA_ARTICLE     = dbo.ZW_T000.YTS_ARTICLE
    INNER JOIN dbo.DISPO                ON dbo.ARTICLE.GA_ARTICLE     = dbo.DISPO.GQ_ARTICLE
    INNER JOIN dbo.CHOIXEXT             ON dbo.ARTICLE.GA_LIBREART1   = dbo.CHOIXEXT.YX_CODE
    LEFT OUTER JOIN dbo.ZW_TGD          ON dbo.ARTICLE.GA_ARTICLE     = dbo.ZW_TGD.YTS_ARTICLE
    LEFT OUTER JOIN dbo.ZW_DATERECEPART ON dbo.ARTICLE.GA_ARTICLE     = dbo.ZW_DATERECEPART.ARTICLE
    INNER JOIN dbo.ZW_ETAT_CONTAINER    ON dbo.ZW_DATERECEPART.Expr1  = dbo.ZW_ETAT_CONTAINER.GP_NUMERO
                                       AND dbo.ARTICLE.GA_ARTICLE     = dbo.ZW_ETAT_CONTAINER.GLARTICLE
    LEFT OUTER JOIN dbo.CATALOGU        ON dbo.ARTICLE.GA_ARTICLE     = dbo.CATALOGU.GCA_ARTICLE
                                       AND dbo.ARTICLE.GA_FOURNPRINC  = dbo.CATALOGU.GCA_TIERS
    LEFT OUTER JOIN dbo.ZWL_STOCKARTA   ON dbo.ARTICLE.GA_ARTICLE     = dbo.ZWL_STOCKARTA.QARTICLE
    LEFT OUTER JOIN dbo.ZW_TDES         ON dbo.ARTICLE.GA_ARTICLE     = dbo.ZW_TDES.YTS_ARTICLE
WHERE (dbo.DISPO.GQ_DEPOT                   = 'C')
  AND (dbo.ARTICLE.GA_FERME                 = '-')
  AND (dbo.ZWL_STOCKARTA.QATT               <> 0)
  AND (dbo.ZW_DATERECEPART.qtecartons       <> 0)
   OR (dbo.DISPO.GQ_DEPOT                   = 'C')
  AND (dbo.ARTICLE.GA_FERME                 = '-')
  AND (LEFT(dbo.ARTICLE.GA_CODEARTICLE, 1)  <> 'a')
  AND (LEFT(dbo.ARTICLE.GA_CODEARTICLE, 1)  <> 'b')
  AND (LEFT(dbo.ARTICLE.GA_CODEARTICLE, 1)  <> 'w')
  AND ((dbo.DISPO.GQ_PHYSIQUE - dbo.DISPO.GQ_RESERVECLI) > 0)
ORDER BY Code
Petit truc : prends systématiquement l'habitude d'aligner ton code. Tu dois bien voir que c'est quand même plus facile à suivre, on se perd moins. Essaye de reprendre ta requête originale et aligne la de la même manière, tu devrais voir très vite ce que j'ai modifié. Le résultat devrait également être différent à l'exécution.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: