Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

verschachtelte SQL Abfrage oder Stored Procedure??

Empfohlene Antworten

Veröffentlicht

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

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 ....

nehmen wir folgende Datenlage an:

11190013410 13.09.07 Kampagne 51,00 STCK

11190013410 14.09.07 Alle Debitoren 51,00 STCK

Soll er für den 14.09.07 den 1. oder den 2. Satz finden?

sehr gut ;-)

hier erst mal de Preis der Kampagne

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.