[Hinweis] Wie poste ich richtig? verwendetes Datenbanksystem: mssql
Hallo,
ich habe da ein kl. Problem.
Meine SQL Abfrage sieht so aus.
SELECT Kunde, KundenNr,
SUM(CASE WHEN YEAR(tz.dDatum) = 2013 THEN tz.fBetrag ELSE 0 END) AS [Gesamt]
FROM tkunde tk
INNER JOIN trechnung tr ON tk.kKunde = tr.tKunde_kKunde
INNER JOIN tZahlung tz ON tr.tBestellung_kBestellung = tz.kBestellung
GROUP BY tk.kKunde, tk.ckundenNr
HAVING SUM(tz.fBetrag) > 1
ORDER BY [Gesamt] DESC
mein Problem hierbei ist, dass leider auch die angezeigt werden, deren SUM 0.00 € ist.
Das HAVING funktioniert problemlos, wenn ich die Gesamtsumme also
SELECT tk.kKunde,tk.cKundenNr,
SUM(tz.fBetrag) AS [Gesamt]
FROM tkunde tk
INNER JOIN trechnung tr ON tk.kKunde = tr.tKunde_kKunde
INNER JOIN tZahlung tz ON tr.tBestellung_kBestellung = tz.kBestellung
GROUP BY tk.kKunde, tk.ckundenNr
HAVING SUM(tz.fBetrag) > 1
ORDER BY [Gesamt] DESC
Könnt Ihr mir dabei bitte helfen. 🤔
Gruß
Laines
Kannst du da nicht das Datum in einem WHERE schon komplett ausschließen?
Mit HAVING kannst du das auch ausfiltern, dann muss aber der Ausdruck mit SUM auch noch ins HAVING mit rein.
wenn ich die Gesamtsumme also
Den Satz könntest du noch so umformulieren dass man weiß was du meinst.
Nein das kann ich leider nicht, da ich die WHERE abfrage bereits für die Suche verwende.
WHERE Firma LIKE ...
OR Name LIKE ...
so sieht meine Komplette Abfrage aus:
SELECT TOP x
tk.kKunde,tk.cKundenNr AS [Kd.Nr],tk.cFirma AS [Firma],tk.cAnrede AS [Anrede],tk.cVorname AS [Vorname],
tk.cName AS [Nachname], tk.cStrasse AS [Strasse], tk.cPLZ AS [PLZ], tk.cOrt AS [Ort], SUM(tz.fBetrag) AS [Umsatz]
FROM tkunde tk
SUM( CASE WHEN YEAR(tz.dDatum) = variableJahreszahl THEN tz.fBetrag ELSE 0 END) AS [Umsatz]
FROM tkunde tk
INNER JOIN trechnung tr ON tk.kKunde = tr.tKunde_kKunde
INNER JOIN tZahlung tz ON tr.tBestellung_kBestellung = tz.kBestellung
WHERE tk.cFirma LIKE '%%'
OR tk.cVorname LIKE '%%'
OR tk.cName LIKE '%%'
OR tk.cPLZ LIKE '%%'
OR tk.cOrt LIKE '%%'
GROUP BY tk.kKunde, tk.ckundenNr, tk.cFirma,
tk.cAnrede, tk.cVorname, tk.cName, tk.cStrasse, tk.cPLZ, tk.cOrt HAVING SUM(tz.fBetrag) ≥ 1 ORDER BY [Umsatz] DESC
wenn ich die Gesamtsumme also
sorry ist etwas missverständlich.
Also die Abfrage filtert aus der Datenbank meine Kunden nach entweder Gesamt Umsatz seit diese in meiner Wawi sind **oder **eben nach dem Jahr, dass ich aus der ComboBox ausgewählt habe.
Hallo Laines,
Wie wäre es mit einer and Verknüpfung
Select ... where tz.fBetrag > 0 and (dein where ) ...
Viele Grüße
Lars
Guten Morgen,
die AND Bedingungen gehen ja nicht dann müssen ja alle Bedingungen erfüllt sein.
Ich vermute ich muss mich doch in LINQ to SQL einarbeiten, dort denke ich kann ich das so realisieren wie ich mir das vorstelle.
Bin trotzdem noch für jeden weiteren Vorschlag dankbar.
Gruß Laines
die AND Bedingungen gehen ja nicht dann müssen ja alle Bedingungen erfüllt sein.
guten morgen,
niemand sagst dass du die ORs mit ANDs ersetzen musst sondern einfach nur eine neue Bedingung hinzufügen musst
[...]
WHERE tz.fBetrag > 0 AND
(tk.cFirma LIKE '%%' [...])
GROUP BY [...]
so würdest du nur die treffer bekommen deren Betrag größer 0 ist UND den kriterien entsprechen.
oder verstehe ich hier was falsch?
MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden!
*"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht."
*"Ignorance simplifies ANY problem."
*"Stoppt die Piraterie der Musikindustrie"
Super !! Danke für die Tips hab's gelößt:
WHERE tz.fBetrag > 0 AND YEAR(tz.dDatum) = " + jahreszahl AND tk.cFirma LIKE '%"+ textBoxSuche.Text + "%' " OR tk.cVorname LIKE '%"+ textBoxSuche.Text + "%' " OR tk.cName LIKE '%"+ textBoxSuche.Text + "%' ...
muß genau in der Reihenfolge sein, sonst klappt es nicht.
Gruß
Laines
Hi,
muß genau in der Reihenfolge sein, sonst klappt es nicht.
deutet darauf hin, dass Deine Klammerung nicht ordentlich die ORs und ANDs unterteilt. Da der Optimizer die Reihenfolge der Auswertung dieser Argumente nach
DB
DB-Version
Systemstatistik
Reihenfolge der Argumente im SQL-Statement
festlegt wirst Du möglicherweise beim nächsten Update-Statistik, einer anderen SQL-Datenbank oder einer neuen MS-SQL Version andere Ergebnisse bekomme. Deine "Lösung" ist. m.E. keine!
Gruß
f_igy
Moin,
deutet darauf hin, dass Deine Klammerung nicht ordentlich die ORs und ANDs unterteilt.
würde ich auch sagen. Du solltest Dir folgenden Link mal durch lesen zur Rangfolge der logischen Operatoren. MSDN
Du solltest Klammern um den OR-teil setzen.
Betrag AND Datum AND ( Firma OR Vorname OR ...)
So wie du es jetzt hast, gibt er Dir auch etwas zurück wenn nur die Bedingung tk.cVorname LIKE '%"+ textBoxSuche.Text wahr ist.
(Vereinfacht: [0 > 1 AND 1 > 2 AND 2 > 3 OR 3 = 3] ist wahr weil 3 = 3)