Laden...

Anzeigen von Kunden über 0 Euro bei SUM( WHEN YEAR...)

Erstellt von Laines vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.162 Views
L
Laines Themenstarter:in
4 Beiträge seit 2013
vor 10 Jahren
Anzeigen von Kunden über 0 Euro bei SUM( WHEN YEAR...)

[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

C
2.122 Beiträge seit 2010
vor 10 Jahren

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.

L
Laines Themenstarter:in
4 Beiträge seit 2013
vor 10 Jahren

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.

2.223 Beiträge seit 2005
vor 10 Jahren

Hallo Laines,

Wie wäre es mit einer and Verknüpfung

Select ... where tz.fBetrag > 0 and (dein where ) ...

Viele Grüße
Lars

L
Laines Themenstarter:in
4 Beiträge seit 2013
vor 10 Jahren

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

P
660 Beiträge seit 2008
vor 10 Jahren

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"

L
Laines Themenstarter:in
4 Beiträge seit 2013
vor 10 Jahren

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

F
115 Beiträge seit 2012
vor 10 Jahren

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

M
19 Beiträge seit 2012
vor 10 Jahren

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)