Hallo,
ich schreibe gerade meine Bachelorarbeit über die Implementierung eines BI-Dashboards und muss hierfür die Daten im "Data Warehouse" vorbereiten. Verwendet wird im Unternehmen die Software "Sisense", die Datenaufbereitung erfolgt dementsprechend in sogenannten ElastiCubes. Sisense verwendet den SQL-92 Standard, aber hat, meiner Meinung nach, nur sehr wenige SQL Befehle verfügbar (Beispielsweise kein ANY oder EXISTS...). Generell habe ich das Gefühl, dass dieses Programm einfach nicht richtig funktioniert. Mit "komplexeren" Abfragen kommt es überhaupt nicht klar, heißt, man muss viele kleine Schritte machen und viele Zwischentabellen anlegen, bis man das gewünschte Ergebnis bekommt.
Die Implementierung ist mittlerweile vollständig und ich bekomme das gewünschte Ergebnis. Allerdings verstehe ich nicht, warum ich über FULL JOIN das richtige Ergebnis bekomme und über INNER JOIN nicht. Ich bin mir nicht sicher, ob ich hier einen extremen Denkfehler habe, oder ob das (mal wieder) nur ein Fehler des Programms ist.
Ausgangslage sind 2 Tabellen:
Datenbank: LANR, Datum, Ziffer, Prüfzeit(in min)
CSV: LANR, Name, angemeldete Stunden, Datum Beginn, Datum Ende
Was ich erreichen möchte:
LANR, Datum und die Summe der Zeit aus der DB ausgeben + Name und angemeldete Stunden aus CSV, bei denen das Datum der Datenbank zwischen den beiden Daten der CSV liegt.
In der CSV gibt es pro LANR häufig auch nur eine angemeldete Stundenzahl, manchmal allerdings auch zwei, z.B. im Jahr 2018 780 und ab dem Jahr 2019 400.
Mein SQL Befehl ist folgender:
SELECT x.LANR, x.Date, y.Stunden, y.Name, SUM(PRUEFZEIT)/60
FROM DB x FULL JOIN CSV y
ON x.LANR = y.LANR
WHERE x.Date BETWEEN y.DatumBeginn AND y.DatumEnde
GROUP BY x.LANR, x.Date, y.Stunden, y.Name
ORDER BY x.LANR, x.Date
Dieser funktioniert auch und ich bekomme das richtige Ergebnis. Allerdings macht meiner Meinung nach dieser FULL JOIN hier überhaupt keinen Sinn, da ich keine NULL Werte habe und jede LANR aus der DB auch in der CSV vorhanden ist, auch sind alle Zeitbereiche abgedeckt.
Bei einem INNER JOIN sieht das Ergebnis allerdings anders aus. Wenn eine LANR hier zwei angemeldete Stundenzahlen hat, also eine für 2018 und eine für 2019, dann bekomme ich bei dieser LANR im Ergebnis pro Tag entsprechend zwei Reihen, mit der Stundenzahl von 2018 und mit der Stundenzahl von 2019. Es ignoriert quasi vollkommen mein WHERE statement.
Was genau ist hier das Problem? Habe ich einen Denkfehler und das kann mit einem INNER JOIN gar nicht funktionieren? Oder ist es wirklich das Programm?
Vielen Dank fürs Lesen und ich hoffe, mich kann jemand aufklären.
lg,
Julia
Edit: Lasse ich bei beiden JOIN Varianten die WHERE Bedingung weg, sind die Datensätze, die ich erhalte, gleich groß, die beiden machen hier quasi das Gleiche.
ich schreibe gerade meine Bachelorarbeit über die Implementierung eines BI-Dashboards und muss hierfür die Daten im "Data Warehouse" vorbereiten. Verwendet wird im Unternehmen die Software "Sisense", die Datenaufbereitung erfolgt dementsprechend in sogenannten ElastiCubes. Sisense verwendet den SQL-92 Standard, aber hat, meiner Meinung nach, nur sehr wenige SQL Befehle verfügbar (Beispielsweise kein ANY oder EXISTS...). Generell habe ich das Gefühl, dass dieses Programm einfach nicht richtig funktioniert. Mit "komplexeren" Abfragen kommt es überhaupt nicht klar, heißt, man muss viele kleine Schritte machen und viele Zwischentabellen anlegen, bis man das gewünschte Ergebnis bekommt.
Die Implementierung ist mittlerweile vollständig und ich bekomme das gewünschte Ergebnis. Allerdings verstehe ich nicht, warum ich über FULL JOIN das richtige Ergebnis bekomme und über INNER JOIN nicht. Ich bin mir nicht sicher, ob ich hier einen extremen Denkfehler habe, oder ob das (mal wieder) nur ein Fehler des Programms ist.
Ausgangslage sind 2 Tabellen:
Datenbank: LANR, Datum, Ziffer, Prüfzeit(in min)
CSV: LANR, Name, angemeldete Stunden, Datum Beginn, Datum Ende
Was ich erreichen möchte:
LANR, Datum und die Summe der Zeit aus der DB ausgeben + Name und angemeldete Stunden aus CSV, bei denen das Datum der Datenbank zwischen den beiden Daten der CSV liegt.
In der CSV gibt es pro LANR häufig auch nur eine angemeldete Stundenzahl, manchmal allerdings auch zwei, z.B. im Jahr 2018 780 und ab dem Jahr 2019 400.
Mein SQL Befehl ist folgender:
SELECT x.LANR, x.Date, y.Stunden, y.Name, SUM(PRUEFZEIT)/60
FROM DB x FULL JOIN CSV y
ON x.LANR = y.LANR
WHERE x.Date BETWEEN y.DatumBeginn AND y.DatumEnde
GROUP BY x.LANR, x.Date, y.Stunden, y.Name
ORDER BY x.LANR, x.Date
Dieser funktioniert auch und ich bekomme das richtige Ergebnis. Allerdings macht meiner Meinung nach dieser FULL JOIN hier überhaupt keinen Sinn, da ich keine NULL Werte habe und jede LANR aus der DB auch in der CSV vorhanden ist, auch sind alle Zeitbereiche abgedeckt.
Bei einem INNER JOIN sieht das Ergebnis allerdings anders aus. Wenn eine LANR hier zwei angemeldete Stundenzahlen hat, also eine für 2018 und eine für 2019, dann bekomme ich bei dieser LANR im Ergebnis pro Tag entsprechend zwei Reihen, mit der Stundenzahl von 2018 und mit der Stundenzahl von 2019. Es ignoriert quasi vollkommen mein WHERE statement.
Was genau ist hier das Problem? Habe ich einen Denkfehler und das kann mit einem INNER JOIN gar nicht funktionieren? Oder ist es wirklich das Programm?
Vielen Dank fürs Lesen und ich hoffe, mich kann jemand aufklären.
lg,
Julia
Edit: Lasse ich bei beiden JOIN Varianten die WHERE Bedingung weg, sind die Datensätze, die ich erhalte, gleich groß, die beiden machen hier quasi das Gleiche.
Comment