2009-03-10 6 views
0

J'ai travaillé avec cela depuis un certain temps maintenant. donc décidé de demander et obtenir de l'aide.Récupérer max enregistrements à partir de sqlserver

J'ai deux tables en tant que tels:

tblTrans: (DocNumber field is always unique) 

DocNumber  TransDate  userId 
66-FF-GHIP  03-05-08  someUser 
55-RT-JHTP  03-09-09  someOtherUser 
77-AF-KPWT  05-08-09  userId1 
09-IO-TEAG  04-08-09  thisUser 


tblTransDet: (productIdCode field + DocNumber fields are always unique) 
DocNumber  ProductIdCode  TransStatus 
66-FF-GHIP  4124    Approved 
66-FF-GHIP  2124    Pending 
66-FF-GHIP  2340    Approved 
77-AF-KPWT  4124    Approved 
55-RT-JHTP  4124    Pending 
09-IO-TEAG  2124    Pending 

Comme vous pouvez le voir. ProductIdCode 4124 répète plusieurs fois dans tblTransDet mais la combinaison de productIdCode et DocNumber est toujours unique.

Comment puis-je récupérer docnumber et productID ... en fonction du docNumber ayant la valeur transDate la plus élevée.

Donc, dans cet exemple. le résultat final serait

77-AF-KPWT 4124 
09-IO-TEAG 2124 
66-FF-GHIP 2340 

Je changerais le tablestrcuture si je pouvais :(

+0

Je ne comprends pas - comment obtenez-vous ProductID 2340 pour le DoC# 66-FF-GHIP basé sur la date? Il ne semble pas y avoir de relation ... –

+0

parce que je reçois tous les productId de cette table. et depuis 2340 est unique ... il devrait apparaître. s'il y avait deux instances de 2340 alors celui avec la date de transaction maximum apparaîtrait –

+0

je ne comprends pas non plus. Peut-être devriez-vous nous montrer un DDL de vos deux tables. –

Répondre

0

vous pouvez utiliser une sous-requête

WHERE Detail.Date = (SELECT MAX(Date) FROM TransDet) 
1

Utilisez un sous-requête correlés - c'est non testé:

SELECT 
    d.DocNumber, d.ProductId, t.TransDate 
FROM 
    tblTransDet d, tblTrans t 
WHERE 
    d.DocNumber = t.DocNumber 
AND 
    t.TransDate = (SELECT MAX(TransDate) FROM tblTrans 
        WHERE DocNumber = d.DocNumber) 
+0

@Neil, je pense que vous devriez relire la question. Avec les données que le PO a donné, ce n'est pas possible. –

+0

cela apporte également des doublons et non une seule ligne de données pour productID et documentnumber. Dans ce cas, tous les numéros de document associés à l'ID de produit 4124 sont affichés. plutôt que de n'apporter que "77-AF-KPWT 4124" puisque ce numéro de document a la date la plus élevée –

0
SELECT * 
FROM (
     SELECT d.DocNumber, d.ProductId, t.TransDate, 
     ROW_NUMBER() OVER (PARTITION BY d.DocNumber, d.ProductId ORDER BY TransDate DESC) AS rn 
     FROM tblTransDet d, tblTrans t 
     WHERE t.DocNumber = d.DocNumber 
     ) 
WHERE rn = 1 
Questions connexes