WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   SQL Select Frage (http://www.wcm.at/forum/showthread.php?t=200683)

Hussl 06.10.2006 07:20

SQL Select Frage
 
Hallo, hätte gerne gewußt, wie euer Select Statement für folgendes aussehen würde.

Zwei Tabellen Kunden und History

Code:

Kunden:
- KundenID
- ...

History:
- HistoryID
- KundenID
- FlagID
- LinkID
- ...

Die Tabelle History ist eine Rechnungshistorie, wo ich Rechnungen, Zahlungen, Gutschriften und Rücküberweisungen speichere.
Code:

FlagID  Beschreibung
-------+----------------
1        Rechnung
2        Zahlung
3        Gutschrift
4        Rücküberweisung

Im Feld History.LinkID steht die HistoryID zu dem jeweilig dazugehörenden Datensatz. Zum Beispiel, wenn ich eine Rechnung habe und der Kunde hat bezahlt, dann steht im Zahlungs-Datensatz die LinkID zur Rechnung. Somit kann ich das eindeutig zuordnen.

Mich würde jetzt interessieren, wie das Select-Statement aussieht, wenn ich zum Beispiel alle Kunden haben will, die schon bezahlt haben. Unter Berücksichtigung evtl. vorhandener Gutschriften und neuerlicher Zahlscheinausstellung. Es kann ja vorkommen, dass ich eine Rechnung geschickt habe, die Adresse oder Firmenname, etc. nicht genau gepasst haben, er daher eine Gutschrift bekommt und dann einen neuerlichen Zahlschein. Das würde dann so ausschauen:
Code:

HistoryID  KundenID  FlagID  LinkID
----------+---------+-------+------
1          1        1            #Rechnung
2          1        3      1    #Gutschrift
3          1        1            #Rechnung

Oder wenn bereits bezahlt wurde, aber eine Rücküberweisung stattgefunden hat
Code:

HistoryID  KundenID  FlagID  LinkID
----------+---------+-------+------
1          1        1            #Rechnung
2          1        2      1    #Zahlung
3          1        3      1    #Gutschrift
4          1        4      1    #Rücküberweisung

In diesem Fall hat der Kunde natürlich nicht bezahlt...

Wie sieht da also die Abfrage aus? Ist übrigens eine Access-Datenbank, aber das ist ja eigentlich Powidl...

iG0r 06.10.2006 08:21

vorm 1. redbull tu ich mir immer schwer aber ich versuchs mal :)

Code:


SELECT kun.*, his.* FROM Kunden AS kun LEFT JOIN History AS his ON (kun.KundenID = his.KundenID) WHERE his.FlagID = 2 AND his.FlagID = 3

diese sql sollte dir alle kunden abfragen, welche flagid 2 und 3 haben, sprich ein zahlungs und gutschrifts flag haben. man kann das WHERE also so wie man es braucht erweitern oder einschränken. mir ist nur gerade unklar wozu du das linkid feld hast, die kunden id ist ja sowieso mit dabei.

Hussl 06.10.2006 19:53

Die LinkID brauch ich dafür, um die Gutschrift einer Rechnung zuordnen zu können. Wie ich geschrieben habe, kann es sein, dass irgendwas auf der Rechnung nicht passt und dann braucht der Kunde eine Gutschrift und erhält dann eine neue Rechnung. Ohne LinkID hätte ich dann zwei Rechnungen und eine Gutschrift und ich wüßte nicht mehr, welche zusammen gehören...

Ich habe mal eine Datenbank erstellt um das besser zu veranschaulichen. Bei der Abfrage Rechnung_nicht_bezahlt kommen zum Beispiel falsche Datensätze raus. Wie der Name schon sagt, will ich nur die haben, die noch nicht bezahlt haben. Das wären die Datensätze mit KundenID 3, 4 und 5. KundenID 1 hat schon bezahlt, also nicht ausgeben und KundenID 2 hat eine Gutschrift auf seine Rechnung und keine neue erhalten, also auch nicht ausgeben.

Verständlich, worum es mir geht??

iG0r 06.10.2006 20:16

Also FlagID 1 haben alle die eine Rechnung bekommen haben und FlagID 2 jene, die eine Zahlung geleistet haben? In LinkID steht dann immer wozu welche Aktion gehör?

Hab leider kein Access, daher kann ich mir dein Beispiel nicht anschaun. Nimm einfach das SQL von mir und verändere das WHERE.

Code:

WHERE his.FlagID = 1 AND his.FlagID != 2
... sollte eigentlich alle mit Rechung auflisten, die aber noch keine Zahlung geleistet haben.


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag