DISTINCT kombiniert mit LIKE ?

Alles, was MariaDB und MySQL betrifft, kann hier besprochen werden.

DISTINCT kombiniert mit LIKE ?

Postby olivator » 11. September 2008 10:55

Tachchen,

ok, das klingt nach heftigem Unfug! Also hier mal, was ich machen will:
In meiner db habe ich die Tabellen kunden und auftraege.

kunden:
id | ... | ... | plz

auftraege:
id | knd_id | ... | ...

Nun möchte ich eine statistische Ausgabe machen und mit einer Abfrage mir die Auftragsmenge sortiert nach den ersten zwei Stellen der PLZ-Bereiche darstellen lassen.

Meine Idee war es dabei DISTINCT einzusetzen. Nun muss ich aber noch sicherstellen, dass sich darauf die ersten zwei Stellen der Postleitzahlen beziehen. Ich dachte dabei LIKE zu verwenden. Oder gibt es da noch was besseres?

LG - Oliver
olivator
 
Posts: 13
Joined: 05. September 2008 08:51

Postby glitzi85 » 11. September 2008 11:40

So?

Code: Select all
SELECT a.irgendwas, b.irgendwas FROM kunden AS a, auftraege AS b WHERE b.knd_id = a.id ORDER BY LEFT(a.plz, 2)


mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby olivator » 11. September 2008 12:03

Die Aufträge pro PLZ-Bereich sollen gezählt werden. So werden mir doch alle gezeigt und nach den ersten zwei stellen der PLZ sortiert, wenn ich das richtig sehe. Ich könnt mir aber vorstellen das Left in der WHERE-Klausel einzusetzen. Dann fehlt aber immer noch was....
olivator
 
Posts: 13
Joined: 05. September 2008 08:51

Postby glitzi85 » 11. September 2008 12:09

Ah, jetzt hab ich's richtig verstanden:

Code: Select all
SELECT LEFT(a.plz, 2), COUNT(LEFT(a.plz,2)) FROM kunden AS a, auftraege AS b WHERE b.knd_id = a.id ORDER BY LEFT(a.plz, 2)


Sollte dir so ne Tabelle ausgeben:

Code: Select all
PLZ   Anzahl
70     3
71     4
72     1
73     0
usw.


mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby olivator » 11. September 2008 12:22

Das Ergebnis ist das, was ich erreichen möchte. Die Abfrage erscheint mir auch logisch. Nur bekomme ich die von der db um die Ohren geschlagen:
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Liegts am COUNT(LEFT(a.plz, 2)) usw. ?

LG - Oliver
olivator
 
Posts: 13
Joined: 05. September 2008 08:51

Postby glitzi85 » 11. September 2008 12:28

OK, dann probier's so:
Code: Select all
SELECT LEFT(a.plz, 2), COUNT(LEFT(a.plz,2)) FROM kunden AS a, auftraege AS b WHERE b.knd_id = a.id GROUP BY a.plz ORDER BY LEFT(a.plz, 2)


mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby olivator » 11. September 2008 18:01

Ich hab das mal geändert in
Code: Select all
SELECT LEFT(a.plz, 2), COUNT(b.id) FROM kunden AS a, auftraege AS b WHERE b.knd_id = a.id GROUP BY a.plz ORDER BY LEFT(a.plz, 2)

womit nicht mehr die PLZ's, sondern die Kunden gezählt werden.

Da bekomme ich dann aber das raus:

PLZ Aufträge
/ 8
06 / 1
06 / 2
10 / 1
10 / 3
10 / 1
10 / 1
10 / 2
10 / 2
10 / 2
10 / 1
12 / 1
12 / 1
12 / 1
12 / 4
12 / 1
12 / 2
12 / 3
12 / 1
12 / 1
13 / 1
13 / 1
13 / 1
13 / 1
13 / 1
13 / 1
13 / 8
14 / 1
14 / 1
14 / 1
14 / 1
15 / 1
16 / 1
16 / 2
16 / 1
18 / 1
18 / 1
18 / 1
18 / 19
18 / 3
18 / 1
18 / 2
18 / 2
18 / 3
18 / 1
18 / 3
18 / 5
18 / 1
18 / 2
18 / 2
18 / 2
20 / 1
23 / 4
29 / 1
30 / 1
61 / 1
99 / 1

Dann habe ich Das LEFT weiter eingesetzt:
Code: Select all
SELECT LEFT(a.plz, 2), COUNT(b.id) FROM kunden AS a, auftraege AS b WHERE b.knd_id = a.id GROUP BY LEFT(a.plz, 2) ORDER BY LEFT(a.plz, 2)

Damit war ich dann am Ziel. Nur wie kommt die erste Zeile zu stande, wenn es wesentlich mehr, als 9 Kunden ohne PLZ bzw. plz = NULL gibt? Die Auftragssumme von den Berliner PLZ's (10, 12, 13, 14) hingegen stimmt.

PLZ Aufträge
/ 9
06 / 3
10 / 32
12 / 17
13 / 14
14 / 6
15 / 2
16 / 4
17 / 2
18 / 79
20 / 1
22 / 1
23 / 4
24 / 1
29 / 1
30 / 1
35 / 1
61 / 1
99 / 1
olivator
 
Posts: 13
Joined: 05. September 2008 08:51

Postby glitzi85 » 11. September 2008 20:42

Hallo,

wie gibst du denn die Daten aus? Wenn ich dein Statement in phpMyAdmin ausführe auf die gleiche Tabellenstruktur, dann bekomme ich z.B. so eine ausgabe:

Code: Select all
LEFT(a.plz,2)  COUNT(b.id)
NULL             3
                 2
00               4
72               2
86               1


Und die Zahlen stimmen auch. Ich hab drei Aufträge für Kunden deren PLZ NULL ist, 4 Aufträge für Kunden deren PLZ mit 00 anfängt und 2 Aufträge für Kunden deren PLZ leer ist.

mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby olivator » 11. September 2008 21:10

Das hatte ich in phpmyadmin zur Kontrolle auch schon gemacht:
8 = NULL
1= leer
Der Rest wie bekannt

Es sind aber einige zig Kunden ohne PLZ in der db. :?:
olivator
 
Posts: 13
Joined: 05. September 2008 08:51

Postby glitzi85 » 11. September 2008 21:27

Haben denn diese leeren PLZ-Kunden auch Aufträge? Du rufst ja nur die Kunden ab, die auch Aufträge haben.
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim


Return to MariaDB - MySQL

Who is online

Users browsing this forum: No registered users and 14 guests