Zum Inhalt springen

verschachtelte SQL Abfrage oder Stored Procedure??


UBAI

Empfohlene Beiträge

Hi,

ich hab da folgendes Problem:

In einer Tabelle stehen zu einem Artikel mehrere VK-Preise (Zeitliche Betrachtung, Mengenbetrachtung, Einheitenbetrachtung).

Ich möchte nun per SQL den aktuell gültigen finden, bekomm das aber nicht gebacken. Hier mal die Vorgehensweise, wie er den gültigen Preis finden soll (vereinfacht, reicht mir aus)

1. Grenze VK-Preise (SP) ab auf die Artikelnummer die identisch ist mit der Artikelnummer aus der Tabelle Artikel (Item) (where SP.[item No] = Item.No)

<--- kein Problem

2. Grenze ab auf das Feld SP.Einheit mit dem Feld Einheit aus der Artikeltabelle (where SP.[unit of measure Code] = Item.[sales Unit of Measure]

<--- kein Problem

3. grenze ab auf das Feld Startdatum in der VK Tabelle. das muss <= dem aktuellem Datum sein oder leer (SQL wäre 1753) <--- sollte ich auch hinbekommen

nun meine Probleme

4. in der gefundenen Datenmenge, grenze ab auf das Feld SP.Type mit dem Wert 3

5. Finde in der Abgrenzung den letzten Datensatz, wurde er gefunden, anzeigen, wenn nicht, grenze das FEld SP.Type ab auf den Wert 2 (die anderen Abgrenzungen beibehalten) ab. Wurde ein Datensatz gefunden, den Preis aus der SP Tabelle anzeigen, wenn keiner gefunden wurde, soll eine 0 angezeigt werden.

Bereich 5 krieg ich nicht gebacken ...... :old

Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok hier mal die Struktur und paar Daten

Tabelle Item

Nr. Verkaufseinheitencode

11190013410 STCK

Tabelle VK-Preise

Artikelnr. Startdatum Verkaufsart VK-Preis Einheitencode

11190013410 16.09.06 Alle Debitoren 40,99 STCK

11190013410 22.03.07 Alle Debitoren 49,99 STCK

11190013410 10.05.07 Alle Debitoren 55,00 STCK

11190013410 10.06.07 Alle Debitoren 59,00 STCK

11190013410 10.09.07 Alle Debitoren 51,00 STCK

11190013410 13.09.07 Alle Debitoren 51,00 STCK

11190013410 13.09.07 Kampagne 51,00 STCK

11190013410 17.09.07 Alle Debitoren 53,00 STCK

11190013410 16.09.06 Alle Debitoren 100,00 PAAR

aktuelles Datum ist der 14.09.2007

ich möchte nun zu dem selectiertem Artikel (11190013410), den heute (14.09) gültigen Preis finden für die im Artikel hinterlegte Verkaufseinheit (Stck)

select Item.[Nr_], SalesPrice.[VK-Preis]

from Item inner join SalesPrice on Item.[Nr_] = SalesPrice.[Artikelnr_]

where SalesPrice.Einheitencode = Item.Verkaufseinheitencode and SalesPrice.Startdatum <= getdate()

das ist ja alles ken problem, nur wie bekomm ich das gebacken, dass er erst nach "Kampagne" sucht und hat er die nicht gefunden für "Alle Debitoren" sucht. Das bekomm ich nicht gebacken ....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Lösungsansatz:

- du aggegiertst auf Artikel und bestimmst die "maximale" Verkaufsart

- zu dem Ergebnis joinst du die Ursprungsdaten a.artikel=b.artikel AND a.verkausart=b.verkaufsart

jetzt hast du alle Artikel mit der gewählten Verkaufsart (Zwischenmenge1)

mit der selben Logik suchst du jetzt auch das maximale Datum, welches aber noch kleiner als das Abfragedatum ist

- agg auf Artikelnummer, max(datum) where datum < eingabedatum

- join der agg mit der Zwischenmenge1 auf a.artikel=b.artikel AND a.datum=b.datum

Für die Logik musst du dir vorstellen, daß Verkaufsart ein Zahlenwert ist, bei dem man das Maximum bestimmen kann, notfalls muss man das vor dem ersten Schritt umsetzen

Die Abfrage liefert dann für:

11190013410 13.09.05 Kampagne 51,00 STCK

11190013410 16.09.06 Alle Debitoren 40,99 STCK

11190013410 22.03.07 Alle Debitoren 49,99 STCK

11190013410 10.05.07 Alle Debitoren 55,00 STCK

11190013410 10.06.07 Alle Debitoren 59,00 STCK

11190013410 10.09.07 Alle Debitoren 51,00 STCK

11190013410 13.09.07 Alle Debitoren 51,00 STCK

11190013410 17.09.07 Alle Debitoren 53,00 STCK

11190013410 16.09.06 Alle Debitoren 100,00 PAAR

-> 11190013410 13.09.05 Kampagne 51,00 STCK

und für:

11190013410 13.09.05 Kampagne 51,00 STCK

11190013410 16.09.06 Alle Debitoren 40,99 STCK

11190013410 22.03.07 Alle Debitoren 49,99 STCK

11190013410 10.05.07 Alle Debitoren 55,00 STCK

11190013410 10.06.07 Alle Debitoren 59,00 STCK

11190013410 13.06.07 Kampagne 51,00 STCK

11190013410 10.09.07 Alle Debitoren 51,00 STCK

11190013410 13.09.07 Alle Debitoren 51,00 STCK

11190013410 16.09.06 Alle Debitoren 100,00 PAAR

11190013410 17.09.07 Alle Debitoren 53,00 STCK

-> 11190013410 13.06.07 Kampagne 51,00 STCK

und für:

11190013410 16.09.06 Alle Debitoren 40,99 STCK

11190013410 22.03.07 Alle Debitoren 49,99 STCK

11190013410 10.05.07 Alle Debitoren 55,00 STCK

11190013410 10.06.07 Alle Debitoren 59,00 STCK

11190013410 10.09.07 Alle Debitoren 51,00 STCK

11190013410 13.09.07 Alle Debitoren 51,00 STCK

11190013410 16.09.06 Alle Debitoren 100,00 PAAR

11190013410 17.09.07 Alle Debitoren 53,00 STCK

-> 11190013410 17.09.07 Alle Debitoren 53,00 STCK

Falls es für diese Art von Abfrage ein fertiges (standard) SQL-Kommando gibt, bitte mal posten, in der Hinsicht kenne ich mich nur wenig aus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mach doch zuerst ein Subquerie auf die aktuell gültigen Werte mit dem aktuellen Datum und dann ne Abfrage auf diese...

SELECT * FROM item

WHERE (startdatum, verkaufsart, einheitencode, artikelnr) IN

(SELECT MAX(startdatum) AS startdatum, verkaufsart, einheitencode, artikelnr FROM item a WHERE startdatum <= NOW() GROUP BY verkaufsart, einheitencode, artikelnr)

mit der Abfrage solltest du alle aktuellen Preise jedes Artikels hinterlegt bekommen.

Wenn du nur von einem bestimmten Artikel die Preise bekommen möchstest mach in das Subquerie noch die Bedingung artikelnr=12354 und du bekommst die Preise für eben nur diesen Artikel

Im Ergebniss ist dann der aktuelle Preis der Kampagne und allen Debitoren zu finden. Du kannst dann ja das verwenden wie du es brauchst...

Hoffentlich hab ich die Frage überhaupt richtig verstanden :)

Gruß Florian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...