mysql Abfrage | zwei Spalten vergleichen und dann aufsummieren

kerkow

Nick
ich brauche bitte Hilfe bei folgendem:

Tabelle
ID | Name | Nummer | Stck
1 | Alpha | | 1
1 | Alpha | 3128 | 1
1 | Alpha | 3128 | 1
1 | | 3128 | 1

Hieraus würde ich gerne wissen, wie oft ein Name bzw. Auftragsnummer in der Tabelle vorkommt.
Also ein COUNT auf Name und einer auf Nummer. Klappt, bei beiden bekomme ich drei heraus. Wenn ich jetzt ein verschachteltes SELECT mache, dann nimmt er nur das erste SELECT an und gibt mir als Ergebnis die 3 Namen z.B. aus.

Wie kann ich es anstellen, dass ich hier als Ergebnis 4 bekomme?
 
SELECT ort,name,nummer,temp.kn AS stck,temp.ks AS preis FROM (
SELECT * FROM
(SELECT *,COUNT(name) AS kn,SUM(filpreis) AS ks FROM x_daten WHERE name!='' GROUP BY name) AS temp_name,
(SELECT * FROM x_daten WHERE nummer!='' GROUP BY nummer) AS temp_nummer
) AS temp WHERE temp.kn > 2 GROUP BY nummer,name
 
Bitte, bitte den Code in Zukunft in [code=sql]mein Code[/code] setzen

Das sieht dann ungefähr so aus und somit auch lesbarer
SQL:
SELECT
	ort,
	name,
	nummer,
	temp.kn AS stck,
	temp.ks AS preis 
FROM
	(
		SELECT 
			* 
		FROM
			(
				SELECT 
					*,
					COUNT(name) AS kn,
					SUM(filpreis) AS ks 
				FROM 
					x_daten 
				WHERE
					name!='' 
				GROUP BY name
			) AS temp_name,
			(
				SELECT 
					* 
				FROM 
					x_daten
				WHERE
					nummer!='' 
				GROUP BY nummer
			) AS temp_nummer
	) AS temp 
WHERE 
	temp.kn > 2 
GROUP BY
	nummer,
	name
item: Du verbindest da 2 Subqueries miteinander ohne JOIN oder WHERE-Verknüpfung. temp_name und temp_nummer. Ist das gewollt, das jede Name mit jeder Nummer ausgegeben wird?

item: Du hast im Subquery temp_name ein GROUP BY auf den Namen, gibts aber wegen dem * Alle Felder aus. Somit gruppiert er im Endeffekt auf alle Felder und ncith nur auf den Namen. Ich weiss zwar nichtm, wass dieses Query bewirken soll und was dein Ziel ist, jedoch mach das wenig Sinn. ggf. ist sowas dort besser (gilt übrigens auch für temp_nummer)
SQL:
			(
				SELECT 
					name,
					COUNT(name) AS kn,
					SUM(filpreis) AS ks 
				FROM 
					x_daten 
				WHERE
					name!='' 
				GROUP BY name
			) AS temp_name,

Am besten schreibst du mal, was das Endresultat sein Soll. Inkl. einem Beispiel. Dann kann ich dir nach meinem Mittagessen weiterhelfen
 
Zuletzt bearbeitet von einem Moderator:
SUPER!

Kunden-Aufträge können eine Auftrags-Nummer oder einen Kommissions-Namen haben, oder im Idealfall beides. Jetzt möchte ich alle Varianten zu einem Kunden auflisten.
Also Kunde KURT hat die Auftragsnummer 1234. Jetzt gibt es den Idealfall zweimal "KURT1234", kommt bei mir in zwei Spalten, einmal der Name in Name und die Nummer in die Auftragsnummer.
Dann kommt ein Eintrag nur mit dem Namen KURT und einmal nur mit der Auftragsnummer 1234. Jetzt habe ich in der DB 4 Einträge, die alle zusammen gehören.
Nun möchte ich wissen, wie oft der Kunde KURT unter der Auftragsnummer 1234 Zeilen in der DB hat = 4.
Klar meine Beschreibung, oder fehlt noch eine Info?
 
Vergessen wir jetzt mal das bestehende Query.
So wie ich dich verstanden habe, hast du die Tabelle xdaten. Darin sind bis zu ?vier kombinationen per Kunde möglich:
Code:
[xdaten]

kunde  | nr   | km_name
-----------------------
Kurt   | 1234 | kommission1
Kurt   | 1234 | 
Kurt   |      | kommission1
Kurt   |      |

Und nun willst du wissen, ob für Kurt diese Vier Varianten da sind?

Mach mir bitte ein Datenbeispiel mit Tabellen. So in der Art:
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1  | 1        | MA1
2  | 1        | MA2
3  | 2        | MA3

Tabelle Firma
id | name
---------------------
1  | firma1
2  | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1        | firma1     | 2
2        | firma3     | 1
 
sorry, werde mein bestes geben:

Tabelle XDATEN
id | ort | kommission | auftragsnummer | stck
----------------------------------------------------
1 | stuttgart | kurt | 1234 | stck
2 | stuttgart | kurt | | stck
3 | stuttgart | | 1234 | stck
4 | muenchen | egon | 567 | stck
5 | muenchen | | 567 | stck
6 | muenchen | egon | | stck
7 | hamburg | fritz | | stck
8 | hamburg | fritz | 890 | stck

ich will wissen, wo mehr als 2 gleiche Aufträge pro Ort vorhanden sind, dort die Stückzahlen aufsummieren:
ort | stueck
--------------------
stuttgart | 3
muenchen | 3
hamburg | 2

also das Ergebnis ist dann:
ort | stueck
--------------------
stuttgart | 3
muenchen | 3
 
Sehe ich das richtig, das folgende währen dann 2 versch. Aufträge auf denselben Ort
Code:
1 | stuttgart | kurt | 1234 | stck
2 | stuttgart | kurt | | stck
3 | stuttgart | | 1234 | stck
10 | stuttgart | hans | 456
 
genau, 2 verschiedene aufträge, einer kommt aber 3 mal vor, der andere nur einmal, also will ich ersteren aufsummiert haben (kommen dann noch wertespalten etc. dazu)
 
Stellt sich nur noch die Frage. Hast du immer einmal die Kombination (kommission | auftragsnummer ) ?
Und sind diese Werte eindeutig oder kann zum Beispiel 'kurt' in mehreren Orten vorkommen?

Wennd u die erste Frage mti ja und die zweite mit Nein beantworten kannst, dann ist das folgende eine mögliche Lösung für MySQL
SQL:
SELECT
	ort,
	lkomm,
	lauftr,
	COUNT(*) AS anzahl,
	SUM(stck) AS summe
FROM
	(
		SELECT
			@last_komm:= IFNULL(x.kommission, @last_komm) AS lkomm,
			@last_auftr:= IFNULL(x.auftragsnummer, @last_auftr) AS lauftr,
			@last_ort := x.ort AS ort,
			x.stck
		FROM
			xdaten AS x,
			(SELECT @last_ort := '', @last_komm := '', @last_auftr := '') AS vars
		ORDER BY
			x.ort,
			x.kommission DESC,
			x.auftragsnummer DESC
	) AS groups
GROUP BY
	ort,
	lkomm,
	lauftr
HAVING
	COUNT(*) > 2

Ergibt dann für dein Beispiel (achtung, Summe ist nicht aufgrund deiner Daten!)
Code:
ort       | lkomm | lauftr | anzahl | summe
-------------------------------------------
muenchen  | egon  | 567    | 3      | 34
stuttgart | kurt  | 1234   | 3      | 48
 
Zurück