Neu SQL Abfrage aus mehreren Tabellen

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
Hallo Zusammen,

ich habe aktuell einen Denkfehler / Verständnisfehler und hoffe das mir von euch jemand weiterhelfen kann.

Folgende Abfrage generiert für jede Position der Bestellung eine neue Zeile. Ich wollte aber nur eine Zeile pro Rechnung.

Wo habe ich den Gedankenfehler?

Code:
SELECT trechnung.dErstellt, trechnung.cRechnungsNr, tZahlung.cExternalTransactionId, tBestellung.cInetBestellNr, tAdresse.cName, tZahlung.cName  FROM trechnung

INNER JOIN tBestellung ON trechnung.tBestellung_kBestellung = tBestellung.kBestellung

INNER JOIN tZahlung ON tZahlung.kBestellung = tBestellung.kBestellung

INNER JOIN tAdresse ON tAdresse.kKunde = tBestellung.tKunde_kKunde

WHERE trechnung.dErstellt BETWEEN  CONVERT(DATETIME,'01.11.2019', 104) AND CONVERT(DATETIME,'30.12.2019', 104)

Grüße
Marcus
 

sjk

Sehr aktives Mitglied
16. Januar 2019
528
239
Moin Marcus,

läuft das SQL in einem Berichtscontainer einer L&L Vorlage oder an einem anderen Ort?
 

waagenwelt

Sehr aktives Mitglied
30. September 2012
499
145
Toppenstedt
Hallo Marcus,

nein, tut sie nicht. ;)

Wenn ein Kunde mehrere Adressen hat, so erzeugt die Abfrage entsprechend viele Zeilen je Rechnung.
Das gleiche gilt für Zahlungen pro Rechnung und multipliziert sich sogar.

Ich würde auf tBestellung.kRechnungsadresse statt auf tBestellung.tKunde_kKunde joinen und eine Summe über die Zahlungen bilden.

Viele Grüße

Stefan
 

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
Hallo.

vielen Dank für die schnellen Rückmeldungen.

@sjk
Die Abfrage ist ein normales query im SQL Manager. Ich teste da nur, ob meine Abfrage das gewünschte Ergebnis bringt. (tut es ja nicht :) )

@waagenwelt
Auf die Rechnungsadresse zu verbinden ist ein gute Idee, die gibt es dann ja nur einmal.
Zahlungen gibt es meistens nur eine pro Rechnung. (Berücksichtigen müsste ich das aber auch noch)

Eventuell ist es doch einfacher, die Abfragen zu trennen.

Das Ganze läuft später in einer C# Anwendung. (verstehe ich wesentlich besser als SQL :D)

Grüße
Marcus
 

Thomas_T

Sehr aktives Mitglied
19. Dezember 2019
250
58
Werdau
Der "Denkfehler" ist der, dass der Query alle Positionen ausgibt, so wie du es auch "verlangt" hast.

Was noch fehlt ist die Zusammenfassung nach Rechnung, also ein "

SQL:
GROUP BY trechnung.cRechnungsNr
 

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
@somobil

Vielen Dank für deine Antwort. Wie du richtig erkannt hast, handelt es sich ehr um Verständnisprobleme als um Denkfehler ;)
Leider sind Computer dumm und tun genau das was man ihnen sagt :D

Das Einfügen der GROUP Funktion führt nun zu einer Fehlermeldung die ich mit meinem aktuellen Wissensstand nicht beheben kann.

Meldung 8120, Ebene 16, Status 1, Zeile 1
Die trechnung.dErstellt-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

Behebung:
Fehler der Ebene 16 sind Fehler, die vom Anwender hervorgerufen werden. Sie können und müssen vom Anwender korrigiert werden. Das Statement kann so nicht ausgeführt werden. Die Spalte muss entweder in einer Aggregatfunktion enthalten sein oder in der GROUP BY Klausel.

Hast du einen Buch-Tipp für mich, damit ich mich mit dem Thema SQL Server näher beschäftigen kann?

SQL:
SELECT trechnung.dErstellt, trechnung.cRechnungsNr, tZahlung.cExternalTransactionId, tBestellung.cInetBestellNr, tAdresse.cName, tZahlung.cName  FROM trechnung

INNER JOIN tBestellung ON trechnung.tBestellung_kBestellung = tBestellung.kBestellung

INNER JOIN tZahlung ON tZahlung.kBestellung = tBestellung.kBestellung

INNER JOIN tAdresse ON tAdresse.kKunde = tBestellung.tKunde_kKunde

WHERE trechnung.dErstellt BETWEEN  CONVERT(DATETIME,'01.11.2019', 104) AND CONVERT(DATETIME,'30.12.2019', 104)

GROUP BY trechnung.cRechnungsNr

Hier die vermutlich sinnbefreite Umgehung des Problems
SQL:
SELECT MIN(trechnung.dErstellt) AS "Datum", 
         trechnung.cRechnungsNr AS "Rechnungsnummer", 
         MIN(tZahlung.cExternalTransactionId) AS "Externe Transaktions ID", 
         MIN(tBestellung.cInetBestellNr) AS "Externe Bestellnummer", 
         MIN(tAdresse.cName) AS "Nachname", 
         MIN(tZahlung.cName) AS "Zahlungsname"  
         
FROM trechnung

INNER JOIN tBestellung ON trechnung.tBestellung_kBestellung = tBestellung.kBestellung

INNER JOIN tZahlung ON tZahlung.kBestellung = tBestellung.kBestellung

INNER JOIN tAdresse ON tAdresse.kKunde = tBestellung.tKunde_kKunde

WHERE trechnung.dErstellt BETWEEN  CONVERT(DATETIME,'01.11.2019', 104) AND CONVERT(DATETIME,'30.12.2019', 104)

GROUP BY trechnung.cRechnungsNr

Grüße
Marcus
 
Zuletzt bearbeitet:

Eiko

Aktives Mitglied
26. Juni 2017
58
3
@somobil

Vielen Dank für deine Antwort. Wie du richtig erkannt hast, handelt es sich ehr um Verständnisprobleme als um Denkfehler ;)
Leider sind Computer dumm und tun genau das was man ihnen sagt :D

Das Einfügen der GROUP Funktion führt nun zu einer Fehlermeldung die ich mit meinem aktuellen Wissensstand nicht beheben kann.


Grüße
Marcus

MMn, wenn du GROUP BY einfügst, musst du alle ausgewählten Spalten gruppieren.
Also:

SQL:
GROUP BY trechnung.cRechnungsNr, trechnung.dErstellt, tZahlung.cExternalTransactionId, tBestellung.cInetBestellNr, tAdresse.cName, tZahlung.cName
 

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
Hallo @Eiko,

vielen Dank für deine Antwort. Mit den o.g. MIN Funktionen hat es zwar auch geklappt, aber dein Hinweis gefällt mir wesentlich besser :)

Vielen Dank dafür.

Grüße
Marcus
 

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
Leider habe ich noch mal eine Frage. Und zwar wird der VKPreis mehrmals summiert. Scheint immer doppelt zu sein.

Was mache ich falsch?

SQL:
SELECT FORMAT(MIN(trechnung.dErstellt),'dd.MM.yyyy') AS "Datum",trechnung.cRechnungsNr AS "Rechnungsnummer",
                FORMAT(SUM(tbestellpos.fVKPreis),'#,0.00') AS "Preis",
                MIN(tZahlung.cExternalTransactionId) AS "Externe Transaktions ID", MIN(tBestellung.cInetBestellNr) AS "Externe Bestellnummer",
                CONCAT(CONCAT(MIN(tAdresse.cVorname), ' '), MIN(tAdresse.cName)) AS "Name",
                MIN(tZahlung.cName) AS "Zahlungsname"  FROM trechnung INNER JOIN tBestellung ON trechnung.tBestellung_kBestellung = tBestellung.kBestellung
                INNER JOIN tZahlung ON tZahlung.kBestellung = tBestellung.kBestellung INNER JOIN tAdresse ON tAdresse.kKunde = tBestellung.tKunde_kKunde
                INNER JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tRechnung.tBestellung_kBestellung
                WHERE trechnung.dErstellt BETWEEN  CONVERT(DATETIME,'01.02.2020', 104) AND CONVERT(DATETIME,'02.02.2020', 104) GROUP BY trechnung.cRechnungsNr
 

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
Für die Nachwelt. Das Problem war, wie @waagenwelt schon geschrieben hatte, die Adresse. Ich hatte immer noch die Kundennummer statt der Rechnungsadresse im join. Dadruch wurde es multipliziert. (Wer Empfehlungen umsetzen kann, ist klar im Vorteil :D) Danke noch mal!

SQL:
SELECT FORMAT(MIN(trechnung.dErstellt),'dd.MM.yyyy') AS "Datum",MIN(trechnung.cRechnungsNr) AS "Rechnungsnummer",
                FORMAT(SUM(tbestellpos.fVKPreis*tBestellpos.nAnzahl),'#,0.00')  AS "Preis",
                MIN(tZahlung.cExternalTransactionId) AS "Externe Transaktions ID",
                MIN(tBestellung.kBestellung) AS "Externe Bestellnummer",
                CONCAT(CONCAT(MIN(tAdresse.cVorname), ' '), MIN(tAdresse.cName)) AS "Name",
                MIN(tZahlung.cName) AS "Zahlungsname"  FROM trechnung
                INNER JOIN tBestellung ON trechnung.tBestellung_kBestellung = tBestellung.kBestellung
                INNER JOIN tZahlung ON tZahlung.kBestellung =  tBestellung.kBestellung
                INNER JOIN tAdresse ON tBestellung.kRechnungsAdresse = tAdresse.kAdresse
                INNER JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
                WHERE trechnung.dErstellt BETWEEN  CONVERT(DATETIME,'01.02.2020', 104) AND CONVERT(DATETIME,'02.02.2020', 104)
                GROUP BY trechnung.cRechnungsNr

Doppler habe ich jetzt immer noch drin. Dieses Problem sollte ich aber auch noch lösen können ... hoffe ich :)

EDIT: kRechnungsAdresse hat eine komplett andere nummer als KKunde.Adresse

Edit2:
INNER JOIN tAdresse ON tAdresse.kAdresse = tBestellung.tAdresse_kAdresse geht auch nicht, da dann die Amazon Bestellungen nicht gefunden werden.

Mir erschließen sich die Adressen gerade nicht ...

Edit3:
trechnungsadresse ist eine ganz andere Tabelle, deshalb konnte ich tBestellung.kRechnungsAdresse nicht mit den Adressen joinen. Mit trechnungsadresse klapp es jetzt aber wunderbar.
 
Zuletzt bearbeitet:

zwitsch

Sehr aktives Mitglied
14. November 2007
425
38
Schau mal bei den Views nach. Dort gibt es die Kunde.vRechnungen (oder so ähnlich, Wawi steht gerade nicht zur Verfügung). Dort findest Du vielleicht die Informationen, die Du benötigst, ganz ohne Join.
 

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
Hey @zwitsch,

das ist ja Klasse :). Da kann ich mir diesen Riesen-Hack ja sparen. In die Views habe ich noch nie geguckt. (Hätte ich tun sollen^^)
Da ist alles drin was ich brauche. (und noch mehr)

Das joinen funktioniert jetzt zwar, aber das View sollte noch etwas zügiger sein.

vielen Dank!

Grüße
Marcus
 

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
So einfach kann die Welt sein :D

SQL:
SELECT FORMAT(Kunde.lvRechnungen.dErstellt,'dd.MM.yyyy') AS "Datum",
                Kunde.lvRechnungen.cRechnungsnummer AS "Rechnungsnummer",
                Kunde.lvRechnungen.fRechnungswert  AS "Umsatz",
                Kunde.lvRechnungen.cShopbestellnummer AS "Externe Transaktions ID",
                CONCAT(CONCAT(Kunde.lvRechnungen.cRechnungsadresseVorname, ' '), Kunde.lvRechnungen.cRechnungsadresseNachname) AS "Name",
                (Kunde.lvRechnungen.cZahlungsartname) AS "Zahlungsname" 
                
FROM Kunde.lvRechnungen

WHERE (dErstellt BETWEEN  CONVERT(DATETIME,'01.02.2020', 104) AND CONVERT(DATETIME,'29.02.2020', 104))
 

marfitec

Sehr aktives Mitglied
10. März 2018
200
36
Für Historische Daten scheint das nicht ganz zu funktionieren. Da sind z.B. cShopbestellnummer von ebay leer. Aber ansonsten TOP!
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu Artikel Filter laufende eBay Angebot funktioniert nicht - SQL Abfrage User helfen Usern - Fragen zu JTL-Wawi 3
Warenbewegung SQL Abfrage JTL-Wawi 1.10 2
Neu Paypal Plugin läßt sich nicht installieren - SQL Fehler Plugins für JTL-Shop 2
Neu Gewinn pro Artikel mit SQL exportieren. User helfen Usern - Fragen zu JTL-Wawi 2
Wo finde ich Kundendaten in der sql Datenbank? JTL-Wawi 1.9 4
Neu Per SQL eine Liste nicht lieferbarer Artikel im Auftrag erstellen User helfen Usern - Fragen zu JTL-Wawi 4
Neu SQL Überverkäufe möglich je Verkaufskanal - in welcher Tabelle steht das? User helfen Usern - Fragen zu JTL-Wawi 1
Neu JTL WaWi (SQL Server)soll nur auf PC laufen User helfen Usern - Fragen zu JTL-Wawi 9
Neu Auftrag (Position) per SQL versenden User helfen Usern - Fragen zu JTL-Wawi 5
Neu Server Hardware für eigenes Wawi / SQL Hosting Installation von JTL-Wawi 3
In Diskussion Rechnungskorrekturen per SQL Vorgangsstatus setzen JTL-Workflows - Ideen, Lob und Kritik 1
Neu Abfrage Business-Kunde in Worklow User helfen Usern - Fragen zu JTL-Wawi 3
Neu if else abfrage Arbeitsabläufe in JTL-Wawi 1
Neu Abfrage offene Aufträge von GESTERN oder VORGESTERN User helfen Usern - Fragen zu JTL-Wawi 3
Neu Abfrage Kinderartikel aktiv für Verkaufskanal, aber Vaterartikel inaktiv Eigene Übersichten in der JTL-Wawi 4
Neu JTL WaWai Artikel aus Angebote von Plattformen Amazon+Otto erstellen Einrichtung und Installation von JTL-eazyAuction 0
Neu JTL Shop (anderes Template) eigene Felder aus Wawi als TAB im Shop User helfen Usern - Fragen zu JTL-Wawi 12
JTL-FFN aus JTL-WaWi entfernen JTL-Wawi 1.9 0
Neu Mail Bestellbestätigung aus dem Shop Betrieb / Pflege von JTL-Shop 1
Wawi WindowsDienst läuft - Worker dennoch aus JTL-Wawi 1.10 18
Neu Rückzahlungen aus JTL Wawi direkt auslösen User helfen Usern - Fragen zu JTL-Wawi 0
Artikelbezeichnungen aus Angebot fehlen im Auftrag JTL-Wawi 1.10 2
Neu JTL-Shop: Anzeige der Artikel aus untergeordneten Kategorien Allgemeine Fragen zu JTL-Shop 2
Neu Workflow lößt bei Track & Trace nicht aus User helfen Usern - Fragen zu JTL-Wawi 1
Neu Korrektur Lieferadresse von Auftrag aus POS User helfen Usern - Fragen zu JTL-Wawi 0
Fehler beim Belegabruf JTL2Datev aus JTL / "Belegkopf-ExtAuftrag...." JTL-Wawi 1.10 2
Neu Produktdatenblatt aus Vorlage Artikeletikett erstellen mit mehr als einer Seite Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 1
Neu Druckvorlage Artikel Etikett Bilder 1, 2, 3 - auch Ausgabeweg POS - beliebig Bilder in jeder Vorlage aus Datenbank zeigen Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Artikel-Bilder löschen entfernt diese nicht aus der DB JTL-Wawi 1.8 4
sporadische Anzeige von Kassenverkauf aus einer Filiale in der Wawi JTL-Wawi 1.9 0
In Diskussion Rechnung per mail / Workflow gibt Fehler aus JTL-Workflows - Fehler und Bugs 6
Neu Artikel werden nach JTL-Abgleich aus Google & YouTube Vertriebskanal entfernt – seit letztem Connector-Update Shopify-Connector 3
Hilfe - Steuerverwaltung bei FBA Versand aus Frankreich Italien & Co. JTL-Wawi 1.9 0
Neu "Direktverkauf" aus dem Lager Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 1
Neu Zusatzfelder aus Shopware 6 an WAWI übertragen Shopware-Connector 0
Neu Artikel aus der Kategorieübersicht zum Warenkorb hinzufügen? Allgemeine Fragen zu JTL-Shop 3
Artikel aus Selektion verschieben JTL-Wawi 1.10 1
Artikel aus Amazon löschen JTL-Wawi 1.7 10
Rechnungserstellung nicht möglich aus Amazon - JTL-Wawi 1.10 3
Kategorien ohne WaWi aus Shop entfernen Einrichtung JTL-Shop5 3
Beantwortet Workflow: Zahlungserinnerung aus dem JTL Guid, versendet beim Testen mehr als nur 1 E-Mail JTL-Workflows - Fehler und Bugs 4

Ähnliche Themen