Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MYSQL Abfrage erweitern

Frage Entwicklung PHP

Mitglied: datadexx

datadexx (Level 1) - Jetzt verbinden

19.10.2012, aktualisiert 17:13 Uhr, 2641 Aufrufe, 11 Kommentare

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.

01.
SELECT DISTINCT tbl.fld AS Kunde, ( 
02.
 
03.
SELECT SUM(NETTO) FROM tbl WHERE fld = tbl.fld AND tbl.fld <2 AND fld !=1 
04.
 
05.
) AS Summe 
06.
 
07.
FROM tbl 
08.
 
09.
INNER JOIN tbl ON tbl.fld = tbl.fld 
10.
 
11.
ORDER BY Summe DESC
Bekomms nicht hin, bzw. Ergebnis ist immer falsch.

Danke für Hilfe!
Mitglied: SlainteMhath
19.10.2012 um 12:05 Uhr
Moin,

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

lg,
Slainte
Bitte warten ..
Mitglied: datadexx
19.10.2012, aktualisiert um 12:13 Uhr
Wo genau soll es denn hin, egal wo ich es platziere, gibt immer nur ne Fehlermeldung!
Bitte warten ..
Mitglied: LianenSchwinger
19.10.2012 um 12:13 Uhr
Hallo,

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

01.
SELECT tbl.fld AS Kunde, 
02.
       SUM(tbl.netto) AS Summe 
03.
FROM tbl 
04.
GROUP BY tbl.fld 
05.
HAVING SUM(tbl.netto) IS NULL
Gruß Jörg
Bitte warten ..
Mitglied: SlainteMhath
19.10.2012 um 12:18 Uhr
Genau! HAVING anstatt WHERE! Irgendwann kann ich mir das auch vielleicht mal merken

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

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

01.
> SELECT tbl.fld AS Kunde, 
02.
>        SUM(tbl.netto) AS Summe 
03.
> FROM tbl 
04.
> GROUP BY tbl.fld 
05.
> HAVING SUM(tbl.netto) IS NULL 
06.
> 
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.
Bitte warten ..
Mitglied: LianenSchwinger
19.10.2012 um 13:02 Uhr
Hallo,

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

01.
SELECT k.kunde AS Kunde, 
02.
       SUM(r.netto) AS Summe, 
03.
       COUNT(r.rechnungsnummer) AS Anz_Offene_Rechnungen 
04.
FROM kunde_tbl AS k 
05.
INNER JOIN rechnung_tbl AS r ON k.kunde = r.kunde 
06.
WHERE "Kriterium Rechnung nicht bezahlt z.B. r.geldeingang IS NULL" 
07.
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
Bitte warten ..
Mitglied: datadexx
19.10.2012 um 13:49 Uhr
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.
Bitte warten ..
Mitglied: LianenSchwinger
19.10.2012, aktualisiert um 16:08 Uhr
... so ein weiterer Versuch

01.
SELECT k.kunde AS Kunde,  
02.
       SUM(r.netto) AS Offene_Netto_Summe,  
03.
       COUNT(r.rechnungsnummer) AS Anz_Offene_Rechnungen  
04.
FROM kundenstamm AS k  
05.
INNER JOIN rechnung AS r ON k.myid = r.kd_nummer  
06.
WHERE r.status < 2 
07.
AND r.gs != 1  
08.
GROUP BY k.kunde 
09.
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
Bitte warten ..
Mitglied: datadexx
19.10.2012, aktualisiert um 17:14 Uhr
Hi Jörg!

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

01.
SELECT k.MYID AS Kunde,  
02.
SUM(r.NETTO) AS Offene_Netto_Summe,  
03.
COUNT(r.RG_NUMMER) AS Anz_Offene_Rechnungen  
04.
FROM kundenstamm AS k  
05.
INNER JOIN rechnung AS r ON k.MYID = r.KD_NUMMER  
06.
WHERE r.status < 2 
07.
AND r.GS != 1  
08.
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.
Bitte warten ..
Mitglied: LianenSchwinger
19.10.2012, aktualisiert um 15:50 Uhr
... 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!?!

01.
SELECT k.customer_id AS Kunde,  
02.
       SUM(r.base_sale_unit_price * r.price_conv_factor * r.buy_qty_due) AS Netto_Summe,  
03.
       COUNT(DISTINCT r.order_no) AS Geplatzte_Auftraege  
04.
FROM customer_info k  
05.
INNER JOIN customer_order_line r ON k.customer_id = r.customer_no  
06.
WHERE r.state = 'Cancelled' 
07.
AND r.catalog_type_db = 'INV'  
08.
GROUP BY k.customer_id 
09.
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
Bitte warten ..
Mitglied: datadexx
19.10.2012 um 15:56 Uhr
Hi Jörg!

Das hat funktioniert!

Vielen Dank und ein schönes Wochenende!!!
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
PHP
MySQL-Abfrage mit php: Wert + true bzw. false (2)

Frage von tomolpi zum Thema PHP ...

Datenbanken
gelöst MYSQL Abfrage (20)

Frage von datadexx zum Thema Datenbanken ...

Datenbanken
gelöst Row Number bei einer Abfrage sinnvoll einsetzen (1)

Frage von Aximand zum Thema Datenbanken ...

Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (24)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...