Einzelnen Beitrag anzeigen

daniel775

Registriert seit: 27. Nov 2010
46 Beiträge
 
#1

Abfrage in Firebird DB über 6 Tabellen

  Alt 9. Sep 2017, 12:22
Datenbank: Firebird • Version: 2.5.2.26540 • Zugriff über: SQL-Manager lite
Hallo,


ich verzweifel gerade an einer Abfrage bzw. an dem Konstrukt der Tabellen in Firebird.

Also die Tabellen müssen folgende Anforderungen erfüllen:
- Ein Artikel muss mehreren Lieferanten zuzuordnen sein.
- Jeder Artikel kann eine fremde Artikel-Nr eines Lieferanten haben.
- Jeder Artikel hat unterschiedliche Einkaufspreise von jeden Lieferanten mit unterschiedlichen Zeiträumen.


Auszug aus dem Aufbau der Tabellen:
(Siehe Anhang)


SQL-Query
Code:

SELECT k.Firmenname, k.KREDITORNR, k1.Datum, pr.LISTENPREIS_NETTO, pr.EKPREIS_NETTO
FROM
KREDITOREN as k,
KREDITOR_PREISE as pr,
REL_KREDITOR_ARTIKEL as r,
REL_KRED_ART_PREISE as rp
JOIN KREDITOREN on k.ID = r.KREDITOR_ID
JOIN REL_KREDITOR_ARTIKEL on r.id = rp.KREDITOR_ART_ID
JOIN REL_KRED_ART_PREISE on rp.KREDITOR_PREISE_ID = pr.id
JOIN (SELECT k.id, MAX(pr.SDATETIME) as Datum
FROM
KREDITOREN as k,
REL_KREDITOR_ARTIKEL as r,
KREDITOR_PREISE as pr
JOIN KREDITOREN on k.ID = r.KREDITOR_ID
JOIN REL_KREDITOR_ARTIKEL on r.KREDITOR_ART_ID = pr.KREDITOR_ART_ID
GROUP BY k.id
) k1
on k1.id = k.id
GROUP BY k.Firmenname, k.KREDITORNR, k1.Datum, pr.LISTENPREIS_NETTO, pr.EKPREIS_NETTO
ORDER BY k1.Datum;

Ergebnis meiner Abfrage ist, das ich 4 Zeilen Ergebnis bekomme, obwohl ich nur 2 Erwarte mit
jeweils eine Zeile und den aktuellen Preisen der beiden Lieferanten.

Wobei das Datum von dem Datensatz der eigentlich nicht im Ergebnis sein soll, das Datum vom Datensatz übernommen hat, das durch "JOIN (SELECT k.id, MAX(pr.SDATETIME) as Datum" als größten Datensatz selektiert wurde.

Die Tabelle "Kreditor_Preise" hat 4 Zeilen. Jeder Lieferant der beiden hat zwei Zeilen. Wobei jede Zeile ein unterschiedliches Datum hat. Also das Ergebnis soll sein 2 Zeilen, 2 Lieferanten, 2 aktuelle Preise. Also mit dem ältesten Datum.

Also zurück zu meinen eigentlichen Frage. Wie erreiche ich bei einer gruppierten Abfrage das nur der Datensatz mit dem ältesten Datum in der Ergebnismenge ist?
Wie muss ich die Tabellen umdesignen um die o.g. anfoderungen zu erfüllen?


Beispiel:
ID Datum Listenpreis Einkaufspreis
1 05.05.2017 699,00 492,70
2 13.08.2017 599,00 392,70
3 25.05.2017 749,00 654,99
4 05.09.2017 799,00 699,99


Über einen Lösungsansatz über den ich auch nachgedacht habe wäre folgender:

D Datum Listenpreis Einkaufspreis Aktiv
1 05.05.2017 699,00 492,70 0
2 13.08.2017 599,00 392,70 1
3 25.05.2017 749,00 654,99 0
4 05.09.2017 799,00 699,99 1

Halt mit einen zusätzlichen Datenfeld "Aktiv"


Danke für das Lesen, hoffe auf zahlreiche-/hilfreiche Antworten
Miniaturansicht angehängter Grafiken
tabellen-beziehungen.jpg  

Geändert von daniel775 ( 9. Sep 2017 um 12:38 Uhr)
  Mit Zitat antworten Zitat