2010-02-04 15 views
0

J'ai la jointure suivante:Comment obtenir le dernier jeu de données avec la jointure SQL?

SELECT l.cFirma AS Lieferant, 
     SUM(la.fEKNetto) AS Verbindlichkeiten, 
     l.kLieferant AS Lieferanten_ID, 
     100 - gk1.fFaktor * 100 AS Grundkondition, 
     MAX(gk1.dDatum) AS Datum 
FROM tBestellung b, tArtikel a, tBestellpos p, tLieferant l, tLiefArtikel la, tGrundkondition gk1 
WHERE 
     CAST('01.01.2010' AS DATETIME) <= CAST(b.dErstellt AS DATETIME) 
     AND b.cType = 'B' 
     AND p.tBestellung_kBestellung = b.kBestellung 
     AND a.kArtikel = p.tArtikel_kArtikel 
     AND l.kLieferant = la.tLieferant_KLieferant 
     AND a.kArtikel = la.tArtikel_kArtikel 
     AND gk1.tLieferant_kLieferant = l.kLieferant 
GROUP BY l.kLieferant, cFirma, gk1.fFaktor 
ORDER BY Verbindlichkeiten DESC, Lieferant 

S'il vous plaît Fokus sur la table alias "tGrundkondition" solk1. Il existe une colonne DATETIME appelée "dDatum" et une clé étrangère "tLieferant_kLieferant".

Maintenant, je n'ai besoin que des données les plus récentes de cette table, jointes aux autres. J'ai déjà utilisé la fonction MAX (gk1.dDatum), mais je reçois toujours toutes les entrées de gk1. Je n'ai besoin que de la dernière version (avec le dDate le plus élevé). En fait, je n'ai pas besoin de sortir la date, mais seulement pour filtrer les données. J'exécute cette instruction sur Microsoft SQL Server via ODBC. Avez-vous besoin de plus d'informations?

J'espère que vous pouvez m'aider. Merci d'avance.

Répondre

2

Vous devez utiliser une sous-requête en corrélation, par exemple ajouter ce qui suit:

WHERE gk1.DATUM = (SELECT MAX(SUB.DATUM) FROM tGrundkondition SUB 
    WHERE SUB.tLieferant_kLieferant = l.kLieferant) 

Je ne suis pas sûr que ce soit 100% correct parce que je ne connais pas votre structure de la table, mais il devrait vous donner une idée.

+0

Merci ça y était . Merci aussi aux autres répondeurs. Mais cette solution renvoie la dernière entrée pour tous les tLieferant tandis que les autres asnwers ne renvoient que la dernière en date (une seule ligne). – c0d3x

0

Essayez de faire quelque chose comme ceci:

SELECT l.cFirma AS Lieferant, 
     SUM(la.fEKNetto) AS Verbindlichkeiten, 
     l.kLieferant AS Lieferanten_ID, 
     100 - gk1.fFaktor * 100 AS Grundkondition, 
     gk1.dDatum AS Datum 
FROM tBestellung b, tArtikel a, tBestellpos p, tLieferant l, tLiefArtikel la, tGrundkondition gk1 
WHERE 
     CAST('01.01.2010' AS DATETIME) <= CAST(b.dErstellt AS DATETIME) 
     AND b.cType = 'B' 
     AND p.tBestellung_kBestellung = b.kBestellung 
     AND a.kArtikel = p.tArtikel_kArtikel 
     AND l.kLieferant = la.tLieferant_KLieferant 
     AND a.kArtikel = la.tArtikel_kArtikel 
     AND gk1.tLieferant_kLieferant = l.kLieferant 
     AND gk1.dDatum = (SELECT MAX(dDatum) from _ITS TABLE_) 
GROUP BY l.kLieferant, cFirma, gk1.fFaktor 
ORDER BY Verbindlichkeiten DESC, Lieferant 

Je ne sais pas si cela fonctionne sur le serveur SQL .... mais j'ai utilisé beaucoup sur DB2

0
SELECT l.cFirma AS Lieferant, 
     SUM(la.fEKNetto) AS Verbindlichkeiten, 
     l.kLieferant AS Lieferanten_ID, 
     100 - gk1.fFaktor * 100 AS Grundkondition, 
     gk1.dDatum AS Datum 
FROM (
     SELECT TOP 1 * 
     FROM tGrundkondition 
     ORDER BY 
       dDatum DESC 
     ) gk1, 
     tBestellung b, tArtikel a, tBestellpos p, tLieferant l, tLiefArtikel la 
WHERE 
     CAST('01.01.2010' AS DATETIME) <= CAST(b.dErstellt AS DATETIME) 
     AND b.cType = 'B' 
     AND p.tBestellung_kBestellung = b.kBestellung 
     AND a.kArtikel = p.tArtikel_kArtikel 
     AND l.kLieferant = la.tLieferant_KLieferant 
     AND a.kArtikel = la.tArtikel_kArtikel 
     AND gk1.tLieferant_kLieferant = l.kLieferant 
GROUP BY l.kLieferant, cFirma, gk1.fFaktor 
ORDER BY Verbindlichkeiten DESC, Lieferant