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
583
262
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
502
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 Suche Servicepartner für SQL-Abfrage Dienstleistung, Jobs und Ähnliches 2
Neu JTL_DirectQuery - SQL Abfrage Anzahl der Pakete auf Versandliste (DPD) User helfen Usern - Fragen zu JTL-Wawi 4
Kundenstammdaten - "Eigenes Feld" in SQL auslesen JTL-Wawi 1.9 2
Aktuelles Update 1.11.7: Anmeldedialog merkt sich den letzten User immer noch nicht & falsche Warnung für angeblich fehlendes SQL Server Update JTL-Wawi 1.11 3
Neu Frage zu SQL Statement - Kunden-Kommentar aus Auftrag auf Pickliste User helfen Usern - Fragen zu JTL-Wawi 1
Neu Bestellungen werden verzögert oder nicht gepullt – Ursache: Zeitzonen-Filter im SQL des WooCommerce-Connectors WooCommerce-Connector 0
Neu SQL Worker.tStatus - Bedeutung von nStatus? JTL Ameise - Eigene Exporte 2
Neu askJan | Neuer KI-Assistent für JTL-Wawi - schnelle, effiziente und transparente KI-Datenanalyse - ohne SQL! Dienstleistung, Jobs und Ähnliches 41
Neu JTL-Wawi 1.11.5: Sequenzieller Kundenexport mit Workflow und SQL-Queue Schnittstellen Import / Export 2
Neu Wie lässt sich der Lieferstatus von Aufträgen per SQL abfragen? User helfen Usern - Fragen zu JTL-Wawi 8
Neu JTL Wawi auf Windows Server 2025 mit SQL 2025? Installation von JTL-Wawi 21
Neu JTL Diag / SQL Mitschnitt lässt sich nicht mehr starten User helfen Usern - Fragen zu JTL-Wawi 12
Neu Abfrage Pakete nach Gewicht, Menge und durchschnittliches Gewicht Eigene Übersichten in der JTL-Wawi 0
USt-IdNr.: Abfrage funkitoniert nicht mehr. JTL-Wawi 1.11 8
Neu DB Abfrage in Rechnung User helfen Usern - Fragen zu JTL-Wawi 9
Neu Zahlung von Kunden aus dem EU Ausland, Mwst falsch Plugins für JTL-Shop 1
Neu CSS GeoIP MwSt.-Finder 2.7.1 verhindert das Anlegen von Shop-Kundenkonten aus der Wawi Plugins für JTL-Shop 1
Neu Shop 5.6.1: Probleme beim Entfernen von Artikeln aus dem Warenkorb JTL-Shop - Fehler und Bugs 5
Neu Versandart Name aus Lieferschain anstatt aus auftrag einsetzen Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 2
Neu Rückverfolgung des Verkaufskanal bei Angeboten aus dem Shop User helfen Usern - Fragen zu JTL-Wawi 3
Neu Rückverfolgung des Verkaufskanal bei Angeboten aus dem Shop Eigene Übersichten in der JTL-Wawi 0
Neu Import von Rechnungen oder Lieferungen aus anderem System Starten mit JTL: Projektabwicklung & Migration 0
Neu Erscheinungsdatum im Artikel aus Lieferdatum in Bestellung Arbeitsabläufe in JTL-Wawi 2
Serienmails aus dem Shop nach Kundenimport Einrichtung JTL-Shop5 0
Neu Artikel aus Shopware in der Wawi importieren und WMS redy machen Shopware-Connector 0
Versandbenachrichtungen werden jetzt aus Wawi versendet JTL-Wawi 1.11 8
Neu Alttexte aus OPC werden beim Slider nicht im Code angezeigt JTL-Wawi - Fehler und Bugs 0
Neu Idee - Versanddatum aus Amazon & eBay als Feld in JTL übernehmen eBay-Anbindung - Ideen, Lob und Kritik 0
Neu Aus einfachen Variationen Variationskombinationen machen Arbeitsabläufe in JTL-Wawi 3
Teilgelieferte Umlagerung bucht vollständig aus Streckenlager aus JTL-Wawi 1.8 0
Artikel Z besteht aus den Positionen A, B und C mit unterschiedlichen Steuersätzen. Wie im Angebot, Auftrag, Rechnung richtig dargestellen ? JTL-Wawi 1.11 4
Neu Umlaute aus Kurzbeschreibung werden nicht angezeigt Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 3
Artikel Gehen nicht aus In Aufträge raus nach Versand JTL-Wawi 1.11 1
Artikelnummern-Konflikt bei JTL-WaWi-Import aus Shopify, SEO-Ranking erhalten JTL-Wawi 1.10 1
Neu Bilddatenimport per Ameise aus fremder Cloud User helfen Usern - Fragen zu JTL-Wawi 2
Neu JERA kann keine Conrad-Erlöse aus JTL importieren, JTL-SCX importiert keine Conrad-Rechnungen JTL-ShippingLabels - Fehler und Bugs 3
Angebot auf EBay erhält Netto Preise aus JTL eBay-Anbindung - Fehler und Bugs 4
Neu Bestellung aus JTL-Shop wird nicht in die Wawi übernommen Allgemeine Fragen zu JTL-Shop 1
Neu Wie verbanne ich Fremdsprachen-Anfragen aus der JTL-Search? Allgemeine Fragen zu JTL-Shop 2
Mehrere Artikel, aus mehreren Aufträgen in einer Retoure bearbeiten - How? JTL-Wawi 1.10 1

Ähnliche Themen