datadexx
Goto Top

MYSQL Abfrage erweitern

Hi Leutz,

folgende Abfrage möchte ich dahingehend erweitern, das geprüft wird ob die Summe der Unterabfrage NULL ist und wenn ja soll der Datensatz nicht mit ausgegeben werden.

SELECT DISTINCT tbl.fld AS Kunde, (

SELECT SUM(NETTO) FROM tbl WHERE fld = tbl.fld AND tbl.fld <2 AND fld !=1

) AS Summe

FROM tbl

INNER JOIN tbl ON tbl.fld = tbl.fld

ORDER BY Summe DESC
Bekomms nicht hin, bzw. Ergebnis ist immer falsch.

Danke für Hilfe!

Content-ID: 193025

Url: https://administrator.de/forum/mysql-abfrage-erweitern-193025.html

Ausgedruckt am: 22.12.2024 um 01:12 Uhr

SlainteMhath
SlainteMhath 19.10.2012 um 12:05:07 Uhr
Goto Top
Moin,

ein
... WHERE Summe IS NOT NULL 
tut's nicht?

lg,
Slainte
datadexx
datadexx 19.10.2012 aktualisiert um 12:13:01 Uhr
Goto Top
Wo genau soll es denn hin, egal wo ich es platziere, gibt immer nur ne Fehlermeldung!
LianenSchwinger
LianenSchwinger 19.10.2012 um 12:13:44 Uhr
Goto Top
Hallo,

ich weiß ja nicht ob das Select so formuliert sein muss.
Aber genügt nicht ein:

SELECT tbl.fld AS Kunde,
       SUM(tbl.netto) AS Summe
FROM tbl
GROUP BY tbl.fld
HAVING SUM(tbl.netto) IS NULL

Gruß Jörg
SlainteMhath
SlainteMhath 19.10.2012 um 12:18:07 Uhr
Goto Top
Genau! HAVING anstatt WHERE! Irgendwann kann ich mir das auch vielleicht mal merken face-smile

@op:
Die mysql Doku hätte dir auch geholfen: http://dev.mysql.com/doc/refman/5.1/de/select.html
datadexx
datadexx 19.10.2012 um 12:22:55 Uhr
Goto Top
Zitat von @LianenSchwinger:
Hallo,

ich weiß ja nicht ob das Select so formuliert sein muss.
Aber genügt nicht ein:

> SELECT tbl.fld AS Kunde,
>        SUM(tbl.netto) AS Summe
> FROM tbl
> GROUP BY tbl.fld
> HAVING SUM(tbl.netto) IS NULL
> 

Gruß Jörg

Ich will ja die, die Null sind ausschliessen. Also nicht anzeigen. Mit IS NOT NULL erhalte ich aber keine Summen der Nettopreise mehr.

Was ich eigentlich machen will, ist aus einer Tabelle den Kunden auslesen, aus der anderen die Summen der nicht bezahlten Rechnungen die zu ihm gehören. Die Kundentabelle hat ca. 3000 Einträge, aber nicht alle haben offene Posten.

Ich will nur die haben, die offene Posten haben und die offenen Posten als Summe.

Meine Abfrage klappt ja, aber sie gibt mir auch die Kunden aus, wo die Berechnung der Summe NULL ergibt und die will ich im Ergebnis aber nicht haben.

Sitz da schon ne Zeit lang dran und bekomme es nicht hin.
LianenSchwinger
LianenSchwinger 19.10.2012 um 13:02:54 Uhr
Goto Top
Hallo,

vielleicht hilft ja das etwas. Ohne genauen Aufbau der Tabelle kann man da nur wage was schreiben.

SELECT k.kunde AS Kunde,
       SUM(r.netto) AS Summe,
       COUNT(r.rechnungsnummer) AS Anz_Offene_Rechnungen
FROM kunde_tbl AS k
INNER JOIN rechnung_tbl AS r ON k.kunde = r.kunde
WHERE "Kriterium Rechnung nicht bezahlt z.B. r.geldeingang IS NULL"  
GROUP BY k.kunde


Dabei werden die beiden Tabellen kunde_tbl und rechnung_tbl über die Kundennummer verbunden und nur die Datensätze benutzt, bei denen das Kriterium Rechnung nicht bezahlt erfüllt ist. Von diesen Datensätzen wird dann die Summe der Nettobeträge gebildet und zusätzlich falls gewünscht noch die Anzahl der offenen Rechnungen ausgegeben.

Es kommen also nur Kunden, die noch offene Rechnungen haben.

Gruß Jörg
datadexx
datadexx 19.10.2012 um 13:49:41 Uhr
Goto Top
Vorab mal Danke für deine Bemühungen!

Ich gebe dir mal die Eckdaten:

Tabelle kundenstamm enthält das Feld MYID <- kundennummer (die benötige ich)

Tabelle rechnung enthält ein feld namens status, hier muss der gespeicherte Wert <2 sein um in das Ergebnis zu dürfen und ein feld namens GS welches nicht den Wert 1 haben darf um ins ergebnis aufgenommen werden zu dürfen sowie das feld NETTO indem die Nettopreise der Rechnungen stehen und ein Feld namens KD_NUMMER wo die Kundennummer drin steht (MYID aus kundenstamm).

Wenn status dann <2 und GS !=1 errechne die Summe (Feld NETTO) der Datensätze mit der Kundennummer(KD_NUMMER) xy.

Wenn die Summe der Datensätze NULL ergibt, dann den Datensatz verwerfen, ansonsten auflisten.

Ergebnis sollte wie folgt aussehen (Anzahl der offenen RG ist eine Option müsste aber nicht sein):

Kundennummer Offene Netto Summe Anzahl RG(optional)

1000 1450,00 € 1
1001 928,34 € 2
1023 54,99 € 1

Die Kundennummern 1002-1022 werden nicht aufgelistet, da die Summenberechnung der offenen RG NULL ergab usw.
LianenSchwinger
LianenSchwinger 19.10.2012 aktualisiert um 16:08:08 Uhr
Goto Top
... so ein weiterer Versuch face-smile

SELECT k.kunde AS Kunde, 
       SUM(r.netto) AS Offene_Netto_Summe, 
       COUNT(r.rechnungsnummer) AS Anz_Offene_Rechnungen 
FROM kundenstamm AS k 
INNER JOIN rechnung AS r ON k.myid = r.kd_nummer 
WHERE r.status < 2
AND r.gs != 1 
GROUP BY k.kunde
HAVING SUM(r.netto) IS NOT NULL

Wobei die HAVING Klausel eigentlich unnötig sein müsste, wenn "r.status < 2 AND r.gs != 1" nur unbezahlte Rechnungen liefert.

Gruß Jörg
datadexx
datadexx 19.10.2012 aktualisiert um 17:14:08 Uhr
Goto Top
Hi Jörg!

Leider funktioniert das so nicht.
Deine Abfrage, die ich dann noch angepasst habe, auf die richtigen Felder und ORDER siehe (

SELECT k.MYID AS Kunde, 
SUM(r.NETTO) AS Offene_Netto_Summe, 
COUNT(r.RG_NUMMER) AS Anz_Offene_Rechnungen 
FROM kundenstamm AS k 
INNER JOIN rechnung AS r ON k.MYID = r.KD_NUMMER 
WHERE r.status < 2
AND r.GS != 1 
ORDER BY Offene_Netto_Summe)
wobei das HAVING (hab ich weg gelassen) eh auch einen fehler ausspuckt (Fehler 1064 syntax error)

liefert sie auch nur einen Kunden zurück mit einem utopischen preis an offenen RG und Anzahl.

Der status <2 und GS !=1 muss auch für die Berechnung der Summe herangezogen werden, nicht zum ermitteln der Rechnungen selbst. Das Ganze sollte sortiert nach der Summe sein, also der Kunde mit der höchsten offenen Summe zuerst.

Ich denke ohne eine subquery ist das nicht machbar.
LianenSchwinger
LianenSchwinger 19.10.2012 aktualisiert um 15:50:30 Uhr
Goto Top
... also Dein SELECT kann ohne die GROUP BY Klausel schon mal nicht funktionieren.

ich habe gerade bei mir Deine Anfrage mit anderen Tabellen und Spalten nachgebaut und bei mir läuft es!?!

SELECT k.customer_id AS Kunde, 
       SUM(r.base_sale_unit_price * r.price_conv_factor * r.buy_qty_due) AS Netto_Summe, 
       COUNT(DISTINCT r.order_no) AS Geplatzte_Auftraege 
FROM customer_info k 
INNER JOIN customer_order_line r ON k.customer_id = r.customer_no 
WHERE r.state = 'Cancelled'  
AND r.catalog_type_db = 'INV'   
GROUP BY k.customer_id
ORDER BY 2 DESC

Bei mir nimmt er halt alle Zeilen der Tabelle customer_order_line wo r.state = 'Cancelled' und r.catalog_type_db = 'INV' ist. Summiert das Produkt aus "r.base_sale_unit_price * r.price_conv_factor * r.buy_qty_due" für jeden Kunden auf und liefert das Ergebnis nach Spalte 2 Absteigend sortiert.

Gruß Jörg
datadexx
datadexx 19.10.2012 um 15:56:20 Uhr
Goto Top
Hi Jörg!

Das hat funktioniert!

Vielen Dank und ein schönes Wochenende!!!