AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken problem mit komplizierter sql abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

problem mit komplizierter sql abfrage

Ein Thema von polondo · begonnen am 9. Aug 2006 · letzter Beitrag vom 11. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
polondo

Registriert seit: 1. Sep 2005
84 Beiträge
 
#1

problem mit komplizierter sql abfrage

  Alt 9. Aug 2006, 21:14
Hallo,

Ich habe 2 Tabellen aus denen ich folgende Information abrufen möchte: Zu einer bestimmten Produkt_id die sich in beiden Tabellen befindet, sollen alle Produkteingänge und Produkabgänge summiert werden und schließlich voneinander abgezogen um den Lagerbestand zu erhalten. Dazu habe ich bereits mit Hilfe anderer User folgende Abfrage:

SQL-Code:
select
  ((SELECT isnull(SUM(quantity),0) FROM productbookingpos
    WHERE prod_ID = 1907
    AND invalid =0)
   -
   (SELECT isnull(SUM(quantity),0) FROM invoicepos
    WHERE prod_ID = 1907
    AND invalid =0)) AS ERGEBNIS
Hierbei habe ich nun das Problem das ich keine Richtigen Werte bekomme wenn mein Produkt bzw. Produkt_id mehrere Ablaufdaten hat(expdates).
Um das Problem zu lösen habe ich nun folgendes gebastelt:

SQL-Code:
SELECT distinct expdate,isnull(SUM(quantity),0) as Input FROM productbookingpos
WHERE prod_ID = 1907 (beispiel)
AND invalid =0
GROUP BY expdate

SELECT distinct expdate,isnull(SUM(quantity),0) as Output FROM invoicepos
WHERE prod_ID = 1907 (beispiel)
AND invalid =0
GROUP BY expdate
Das Ergebnis sieht so aus:

Für den Produkteingang:
expdate quantity
04/04/30 98
04/12/30 361
10/10/30 72

Für den Produktausgang:
expdate quantity
04/04/30 97
04/12/30 359

Wie ist es nun möglich diese beiden Abfragen zusammenzuschmeißen und dabei pro expdate die Differenz als Lagerbestand zu bekommen.
Das mein Ergebnis also folgendermaßen aussieht:

expdate Restbestand
04/04/30 1
04/12/30 2
10/10/30 0 (oder aber garnichts angezeigt da ja kein passender Eintrag im Produtkausgang vorhanden ist)

Ich wär für alle Antworten sehr dankbar, da mich das ganz schon zu lange beschäftigt.
Ich arbeite mit dem SqlServer2000.
Hoffe einer wird schlau aus dem was ich geschrieben hab

mfg R.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: problem mit komplizierter sql abfrage

  Alt 9. Aug 2006, 21:53
Hallo polondo,

vielleicht so...

SQL-Code:
SELECT 'productbookingpos & invoicepos', a.prod_id,
       DATEDIFF(day, a.expdate, b.expdate) tage,
       COALESCE(SUM(a.quantity), 0) - COALESCE(SUM(b.quantity), 0) ergebnis
FROM productbookingpos a
INNER JOIN invoicepos b
  ON a.prod_id = b.prod_id
     AND b.invalid = 0
WHERE a.invalid = 0
GROUP BY a.prod_id, a.expdate, b.expdate

UNION

SELECT 'nur productbookingpos',
       prod_id,
       NULL tage,
       COALESCE(SUM(quantity), 0) ergebnis
FROM productbookingpos a
WHERE invalid = 0
  AND NOT EXISTS (SELECT *
                  FROM invoicepos
                  WHERE prod_id = a.prod_id
                    AND invalid = 0)
GROUP BY prod_id, expdate

UNION

SELECT 'nur invoicepos',
       prod_id,
       NULL tage,
       COALESCE(SUM(quantity), 0) ergebnis
FROM invoicepos a
WHERE invalid = 0
  AND NOT EXISTS (SELECT *
                  FROM productbookingpos
                  WHERE prod_id = a.prod_id
                    AND invalid = 0)
GROUP BY prod_id, expdate
Gruss
Thorsten
  Mit Zitat antworten Zitat
polondo

Registriert seit: 1. Sep 2005
84 Beiträge
 
#3

Re: problem mit komplizierter sql abfrage

  Alt 9. Aug 2006, 22:02
Danke erstmal für deine Antwort!
Wenn ich das ausführe meldet mir der query-assistent vom sqlserver folgendes:

Arithmetischer Überlauffehler beim Konvertieren von expression in den Datentyp datetime.
[Microsoft][ODBC SQL Server Driver]Fehler in der Funktionsreihenfolge
  Mit Zitat antworten Zitat
polondo

Registriert seit: 1. Sep 2005
84 Beiträge
 
#4

Re: problem mit komplizierter sql abfrage

  Alt 9. Aug 2006, 22:09
entschuldige bitte der Fehler ist dieser hier. habe den falsch reinkopiert.

Server: Nachr.-Nr. 8115, Schweregrad 16, Status 2, Zeile 1
Arithmetischer Überlauffehler beim Konvertieren von expression in den Datentyp datetime.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: problem mit komplizierter sql abfrage

  Alt 9. Aug 2006, 22:13
Ok, hab mich schon über die ODBC-Info gewundert. Ich habe das Statement nochmal geändert. Sollte aber trotzdem noch der selbe Fehler kommen. Du möchtest immer alle Zeilen haben auch wenn es in der einen Tabelle gar keinen Eintrag gibt? Deshalb jetzt die drei Abfragen. Allerdings kann nur, wenn in beiden Tabellen ein Datum steht auch eine Differenz gebildet werden. Da war mir schonmal nicht ganz klar was für eine Differenz du meinst. Ich habe jetzt Tage als Einheit gewählt. Dort denke ich wird wohl auch der Fehler sein. Nimm dochmal das DATEDIFF raus (einfach mal mit NULL ersetzten) vielleicht liegt es da dran. Ich kenne deine Daten ja nicht.

Gruss
Thorsten
  Mit Zitat antworten Zitat
polondo

Registriert seit: 1. Sep 2005
84 Beiträge
 
#6

Re: problem mit komplizierter sql abfrage

  Alt 10. Aug 2006, 08:53
Wahrscheinlich war meine Erklärung etwas mißverständlich.
Um das ganze vielleicht etwas zu vereinfachen mach ich es mal anders.
Stell dir vor ich habe diese beiden Tabellen mit folgendem Inhalt:

Wareneingang:
expdate datum anzahl
prod_id1 04/04/30 5
prod_id2 04/12/30 8
prod_id3 10/10/30 9

Warenausgang:
expdate datum anzahl
prod_id1 04/04/30 2
prod_id2 04/12/30 4

ich möchte mit einer sql-Abfrage dann zu folgendem Ergebniss kommen:

prod_id datum Restbestand im Lager
prod_id1 04/04/30 3
prod_id2 04/12/30 4

Das heißt einmal geht es darum pro Tabelle eine Summe der Anzahl pro Prod_id & dazugehörigem Datum zu bilden und zum Zweiten dann diese Summen pro prod_id und Datum entsprechend ihrer prod_ids voneinander abzuziehen, sodass ich dann den Restbestand in meinem Lager bekomme.
P.S: Falls Du dich fragst wieso das Datum eine so wichtige Rolle bei dem ganzen spielt dann ist das ganz einfach: Da es sich um ein Lagerverwaltungsprogramm für eine Firma mit Chemikalien handelt, stellt das Datum ein Ablaufdatum dar und ist zigleich mit der Prod_id ein gemeinsamer Schlüssel in der DB.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: problem mit komplizierter sql abfrage

  Alt 10. Aug 2006, 09:49
Du könntest eine View erstellen, mit der Du dann später deine Abfragen formulierst:

SQL-Code:
create view Bewegungen
as
select expdate, datum, anzahl from Wareneingang
union
select expdate, datum, -anzahl as anzahl from Warenausgang
Mit dieser View hast Du dann Ein- und Ausgänge in einem Select. Ausgänge werden als negativ übernommen, so dass du einfach über die Spalte Anzahl summieren kannst:

SQL-Code:
select expdate, datum, sum(anzahl) as AnzahlCumul
from Bewegungen
group by expdate, datum
  Mit Zitat antworten Zitat
polondo

Registriert seit: 1. Sep 2005
84 Beiträge
 
#8

Re: problem mit komplizierter sql abfrage

  Alt 10. Aug 2006, 12:18
Danke erstmal!

An eine View hatte ich auch schon gedacht, allerdings würde ich gerne eine Abfrage haben die alles mit einem Schlag erledigt. Sollte eigentlich dazu dienen um meinen bisherigen Code etwas zu vereinfachen.


mfg R.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: problem mit komplizierter sql abfrage

  Alt 10. Aug 2006, 12:58
Hast Du doch dann... Die View erstellst Du ja nur einmal auf dem Server... In Delphi benutzt Du nur die 2. Abfrage
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: problem mit komplizierter sql abfrage

  Alt 10. Aug 2006, 15:01
Wenn das ganze in eine Abfrage soll...

SQL-Code:
SELECT expdate, datum, SUM(anzahl) AS AnzahlCumul
FROM (SELECT expdate, datum, anzahl
      FROM wareneingang
      UNION
      SELECT expdate, datum, -anzahl AS anzahl
      FROM warenausgang) x
GROUP BY expdate, datum
Gruss
Thorsten
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz