2010-02-05 4 views
3

Possible en double:
Retrieving the last record in each groupSélection du dernier par groupe d'articles

i ont 2 tables produits et coût

DU PRODUIT

ProdCode - PK 
ProdName 

COÛT

Effectivedate - PK 
RetailCOst 
Prodcode 

j'ai essayé cette requête:

SELECT a.ProdCOde AS id, MAX(EffectiveDate) AS edate, RetailCOst AS retail 
FROM cost a 
INNER JOIN product b USING (ProdCode) 
WHERE EffectiveDate <= '2009-10-01' 
GROUP BY a.ProdCode; 

Uhm yah son montrant le droit EffectiveDate mais le coût de ce match EffectiveDate ne marche pas spécifique. Je veux donc sélectionner la dernière date avec le coût correspondant par article.

par exemple la date i choisi est « 2009-12-25 » et les dossiers 1 article sont les suivants:

ProdCode |EffectiveDate| Cost 
00010000 | 2009-01-05 | 50 
00010000 | 2009-05-25 | 48 
00010000 | 2010-07-01 | 40 

donc dans le résultat que je devrais obtenir 00010000|2009-05-25|48 parce qu'il est moindre que la date de mon requête et il est le dernier pour cet article. et puis je veux montrer sur ma requête les derniers coûts sur chaque produit.

espérons avoir de vos nouvelles bientôt! Merci!

Répondre

2

Vous devez utiliser une sous-requête ici:

SELECT maxdates.ProdCode, maxdates.maxDate, cost.RetailCost as retail 
    SELECT ProdCode, max(EffectiveDate) as maxDate 
    FROM cost 
    WHERE EffectiveDate < '2009-10-01' 
    GROUP BY ProdCode 
) maxdates 
LEFT JOIN cost ON (maxdates.ProdCode=cost.ProdCode 
       AND maxdates.maxDate=cost.EffectiveDate) 

Explication: Le SELECT intérieur donne une liste de tous les produits et leurs EffectiveDates maximales respectives. La jointure "colle" le coût de détail par entrée de données au résultat.

+0

merci! Je l'ai déjà utilisé dans mes requêtes! – QWERTY

1

Alternativement, en utilisant l'ancien truc max concat devrait faire l'affaire.

SELECT 
    p.ProdCode, 
    SUBSTRING(MAX(CONCAT(d.EffectiveDate, c.RetailCost)), 1, 10) AS date, 
    SUBSTRING(MAX(CONCAT(d.EffectiveDate, c.RetailCost)), 10, 100) + 0 AS cost 
FROM 
    product p, 
    cost  c 
WHERE 
    p.ProdCode = c.ProdCode AND 
    c.EffectiveDate < '2009-10-01' 
GROUP BY 
    p.ProdCode 
Questions connexes