SQL: Vergleichen mit einem nicht existierendem Datensatz

vika0507

Grünschnabel
Hallo,

ich habe ein Problem mit meiner Datenbank und würde mich über jegliche Hilfe sehr dankbar sein.
Ich versuche so gut es geht mein Problem zu beschreiben...

Ich erstelle eine Datenbank die zwei Quartale vergleichen soll (altes mit aktuellem). Dafür habe ich zwei Tabellen erstellt eine "Zeitraum_t" und eine "Zeitraum_t-1" und diese verknüpft . Als ergebniss bekomme ich eine Tabelle die nur die Datensätze enthalt, die in beidet Tabellen vorhanden sind.

Tabelle "Zeitraum_t" hat eine Spalte mit Quartal 1617Q4 und 1718Q1 (berechnet aus dem Datum) und eine Hilfsspalte Quartal_alt, diese habe ich mit einer Formel berechnet (einfach -3 Monate vom realem Datum) --> 1617Q3 und 1617Q4
Tabelle "Zeitraum_t-1" hat auch eine Spalte mit Quartal 1617Q4 und 1718Q1.

Mein Q4 wird ja zu Q3 und Q1 zu Q4...Somit kann ich Q1 mit Q4 vergleichen.
Anschliessend erstelle ich eine neue Tabelle aus diesen Beiden "Vergleich t mit t-1" Die Tabelle enthält nur Q4 und die entsprachenden Werte.

Resultierende Tabelle-->
Spalten: Quartal = 1617Q4
Spalte: Wert für t aus Tabelle "t" = 1
Spalte: Wert für t-1 aus Tabelle"t-1" = 2



Es funktioniert auch alles perfect nur gibt es ein Problem. Wenn z.B. in einer Tabelle es keinen Datensatz gibt (existiert keine entsprechende Zeile) in der anderen aber schon. Dann weiss die Datenbank nicht mit was sie vergleichen soll und gibt diese Werte nicht aus. Ich will aber dass sie dann eine 0 als Wert rausspuckt. Somit wenn es keine entsprechende Zeile existiert, dann soll sie mit 0 vergleichen.

Z.B hat (Tabelle "t") noch einen Wert=3 in (Tabelle"t-1)" jedoch nicht (nicht die Zelle ist leer sonder komplette Zeile existiert nicht!), deshalbt fehlt diese Spalte mir. Ich will aber als Ergebnis:


Resultierende Tabelle-->
Spalten: Quartal = 1617Q4
Spalte: Wert für t aus Tabelle "t" = 1 , nächste Zeile =3
Spalte: Wert für t-1 aus Tabelle"t-1" = 2 , nächste Zeile =0


Da ich aber noch in Access und SQL ein Amatour bin ist es eine Herausforderung für mich.
So habe ich das versucht zu lösen, aber irgentwie funktioniert es doch nicht:

Wenn(IsMissing([Zeitraum_t].[Wert)]);0;[Zeitraum_t]![Wert)])

Hoffe konnte es mehr oder weniger gut erklären und bedanke mich schon mal für die Hilfe.
 
Aua. 2 gleiche Tabellen für verschiedene Zeiträume? Warum? Das macht man in Excel, aber niemals in einer Datenbank!
Mach es nicht. Du machst dir das Leben grausam schwer damit. In jeder Abfrage, idem Datenzugriff musst du jeweils wissen, in welcher Tabelle etwas ist.

ich helfe dir gerne Ordnung in die Daten zu bringen und dann das Problem anzugehen.
 
Am Ende verschiebe ich die Tabellen aus der DB mit Pivor Piwot und erstelle eine Pivot Tabelle wo eben die Diff von den beiden Quartalen zu sehen ist und ein Diagramm dazu. In dieser muss ich nur ein Mal alle 3 Monate den Filter anpassen. Es ist auch eigentlich ganz einfach wenn es immer einen Vergleichswert gibt :( Ich muss nur irgentwie der DB befehlen eine neue Zeile zu schreiben falls es diesen nicht gibt.

Also eine bessere Darstellung konnte ich mir nicht einfallen lassen :(

Wie kann ich es denn besser /optimales gestalten in Acces oder PP oder Excel, weil ich will schon dass am Ende ich nur eine Sache anpasse und der Rest von selber geht.
 
Also das hört sich wirklich gruselig an. Du solltest dafür wirklich keine 2 Tabellen verwenden. Ich habe noch nicht ganz verstanden, was du genau vergleichst, aber du kannst eine Tabelle mit der Spalte Datum und dann mit einer Spalte für die Werte die du vergleichen möchtest aufbauen. Die Abfrage die du dann erstellst, kannst du dann auch so aufbauen, wie du die Vergleiche benötigst.

Sobald man den Aufbau deiner Daten kennt, kann man dir da sicher auch beim Erstellen der Abfrage weiterhelfen.

Nochmal für mich, du willst die Daten auf einer PHP Seite darstellen und hast sowas wie eine MySQL DB dahinter oder?
 
ich lade mir Daten aus SAP in Excel Tabellen runter und übertrage sie in eine Access DB, die dann weiter die Daten bearbeitet und am Ende mache ich ne Pivot Tabelle.
Die Tabellen sind auch riessig und mein PC kann mit ihnen nicht arbeiten, deshalb habe ich auch eine DB erstellt, da sonst es einfach nicht ging.
 
Wenn du die Daten dann aus SAP in deine eine Tabelle geschrieben hast, dann könntest du eine Abfrage erstellen die dir das erste Quartal ausgibt
Im Step 2 joinst du dir noch die anderen 3 Quartale aus der selben Tabelle dazu
Im letzte Schritt musst du dann nur noch deine Anzeigebedingung definieren, da du ja nur das sehen willst, was deinem Vergleich entspricht

kleines Bsp. Wenn du 3 Felder hast (Datum,Artikel,verkaufte Menge)
Das Ergebnis könnte dann sein
Jahr 2016 (Datum), Brötchen (Artikel),Summe Q1 (Menge), Summe Q2 (Menge),…
Die Menge Q2 – Q4 würden aus den Join kommen. Da du dies aber aus der Tabelle in eine Pivot verwenden willst ist fraglich ob der Aufbau meines Bsp. optimal für dich ist.

du könntest die SAP Daten ggef auch schon zusammenfassen bzw. abfiltern, so dass du nicht so viele Daten bekommst
 
hhhh das ist eine gute Idee! : )) Aber kann es nicht sein, dass ich wieder mit dem Problem zusammenstosse, dass falls es kein Datensatz in einem Quartal existiert, sprich kein Jahr, kein Artikel und keine Summe Q1 existiert in Q2 jedoch schon, dass die DB nicht weiss mit was sie vergleichen soll.

Bei mir siehts jetzt so aus z.B.
Jahr 2016(Datum), Brötchen (Artikel), Q1 Menge, Q2 Menge -->die werden verglichen
Jahr 2015 (Datum), Orangen(Artikel), Q1 Menge

Q2 existiert nicht ( im 2 Quartal wurden keine Orangen verkauft und es gibt so eine Zeile nicht )und deshalb spuckt mir die DB nur das Jahr 2016 aus.
 
Moin, bezugnehmend auf dein Beispiel, da ist das Quartal 1 vorhanden, dann kannst du den Summenwert aus dem left join mit einem isnull abfragen

ISNULL(SUM(Menge),0);

dann wird immer eine Menge 0 ausgegeben wenn nichts zu einem Quartal vorhanden ist und alle weiteren Systeme, die mit den Daten arbeiten sollen, haben kein Problem
sollte es tatsächlich vorkommen das Q1 auch mal nicht da ist, dann hätte ich folgenden Lösungsansatz
erstelle dir einen Cursor den du mit deinen Quartalen aufbaust die du brauchst, entweder fragst du eine Datumstabelle ab oder hast eine Prozedur der du z.B. das Startdatum und die Anzahl Jahre mitgibst, das wäre dann flexibel und Datentechnisch eingrenzbar
dann machst du ein Select auf dein Datums (Cursor oder was auch immer) und joinst dir die 4 Quartale mit der Absicherung ISNULL heran
um mal bei dem Beispiel zu bleiben, du musst wohl noch eine weitere Ebene mit einbinden da du vor dem Ermitteln der Mengen, erst die Artikel heran joinst die im Ganzen Jahr vorhanden sind
ggf. kann man dies beim erstellen des Cursors gleich mit einbinden, andernfalls können einge Artikel untergehen, denke ich.
 
Zurück