![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: UniDac
Select mit Summe über Tabellen mit Join
Hallo Leute,
könnt Ihr mir mal helfen einen Select zu bauen Ich habe hier zwei Tabellen.
Delphi-Quellcode:
Tabell1:
Zähler Lagerplatz 1, Schrank 1 2, Schrank 2 3, Schrank 3 4, Schrank 4 5, Schrank 5 6, Schrank 6
Delphi-Quellcode:
Als Ergebnis möchte ich die Beträge haben je Schrank. Hier ist das Problem ich möchte auch die leeren Schränke haben
Tabelle 2:
Artikel, IDSchrank, Preis Roter Kleber, 1, 15,20 Gelber Kleber, 1, 7,25 Grüner Kleber, 2, 13,14 Rosa Kleber, 4, 14,87
Delphi-Quellcode:
Ich habe es im Selecht mit Full Join versucht oder Left Outer usw. es geht nicht. Die Leeren Schränke kommen nicht raus ?
Schrank 1, 22,45
Schrank 2, 13,87 Schrank 3, 0,00 -.> oder auch leer Hauptsache es ist der Schrank 3 hier vorhanden Schrank 4, 14,87 Schrank 5, 0,00 -.> oder auch leer Hauptsache es ist der Schrank 5 hier vorhanden Schrank 6, 0,00 -.> oder auch leer Hauptsache es ist der Schrank 6 hier vorhanden Select Tabelle1.Lagerpaltz, Sum(Tabelle2.Preis) From Tabelle1 Left Outer Join Tabelle2 on Tabelle1.Zähler = Tabelle2.IDSchrank |
AW: Select mit Summe über Tabellen mit Join
Left outer join
SQL-Code:
Select
t1.Lagerplatz, t2.Artikel, t2.Preis from Tabelle1 t1 left join Tabelle t2 on t2.IDSchrank = t1.ID; |
AW: Select mit Summe über Tabellen mit Join
Ich möchte die Summe des Preises haben. mit Sum und Group by gehet es nicht wenn ein Schrank leer ist.
|
AW: Select mit Summe über Tabellen mit Join
Code:
with summen as
( select idschrank, sum(preis) as summe from tabelle2 group by idschrank ) select t1.lagerplatz, s.summe from tabelle1 t1 left join summen s on t1.ZAEHLER = s.idschrank |
AW: Select mit Summe über Tabellen mit Join
Oder
SQL-Code:
Select
t1.Lagerplatz, t2.Artikel, sum( coalesce(t2.Preis, 0) as Preis) from Tabelle1 t1 left join Tabelle t2 on t2.IDSchrank = t1.ID group by t1.Lagerplatz, t2.Artikel; |
AW: Select mit Summe über Tabellen mit Join
Left Join ist schon richtig, wenn man davon ausgehen muss, dass nicht alle Lagerplätze befüllt sind.
Wichtig ist für die Ausgabe von "Leerwerten" immer, dass sie trotzdem als Datum vorhanden sein müssen. SQL kann keine Daten anzeigen, die nicht da sind. Also muss man in diesem Fall die Lagerplatzdefinition auslesen und mit den Artikeln joinen. Die With Lösung von Frickler macht das auch, vielleicht sogar schneller, aber ich finde es klassisch schicker und verständlicher
Code:
select lager.zähler, lager.lagerplatz,
sum(artikel.preis) as summe_preis from Tabell1 as lager left join tabelle2 as artikel on lager.zähler = artikel.IDSchrank group by lager.zähler, lager.lagerplatz |
AW: Select mit Summe über Tabellen mit Join
Noch ein Tipp von mir dazu:
Ich sorge beim DB-Entwurf bei solchen Feldern mit einem Default Wert dafür, dass gar keine NULL Werte entstehen. Da wo das möglich ist, kann man die Probleme schon im Vorfeld minimieren. Grüße Rolf |
AW: Select mit Summe über Tabellen mit Join
@rokli die Nullwerte entstehen durch den outer Join.
|
AW: Select mit Summe über Tabellen mit Join
Zitat:
SQL-Code:
Änderung ist hier coalesce durch IsNull ersetzt zu haben. Das hat bei ADS und SQLServer zur Folge dass auch dann summiert wird wenn in einem der Datensätze NULL für Preis steht.
Select
t1.Lagerplatz, t2.Artikel, sum( IsNull(t2.Preis, 0) as Preis) from Tabelle1 t1 left join Tabelle t2 on t2.IDSchrank = t1.ID group by t1.Lagerplatz, t2.Artikel; -> Wobei ich mich natürlich hüte mit deutschen Feldnamen zu arbeiten. :lol: |
AW: Select mit Summe über Tabellen mit Join
Hallo Leute,
hier mal das Ergebnis von meinen Testes welche ich gerade eben mal gemacht habe. @Frickler Dein Weg funktioniert. Es dauert etwas bis das Ergbnis kommt. @mkinzler Der Weg über coalesce funktioniert leider nicht. Es kommen die freien Lagerplätze nicht mit raus. @jobo SO hatte ich auch mal angefangen. Das geht leider nicht. Es kommen hier nicht die Leere Lagerplätze mit raus. @Sinspin isNULL kennt der Firebird leider nicht. In meinen Feld sind keie Umlaute dir. Ich habe es hur zu besseren lebarkeit so eingestellt. Das mit dem Umlauten traue ich micht auch nicht. Somit werde ich mal den Weg von Frickler benutzen auch wenn es etwas länger dauert bis das ergebnis kommt. Danke alle alle für Eure Hilfe hier. Mal sehen eventuell hat ja noch jemadn einen Tip für mich der schneller geht. Tanja |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz