mySQL - komplexe Abfrage solll Agregat-Ergebnisse Spaltenweise zeigen.

NetBull

Erfahrenes Mitglied
Hi Leute,

habe folgendes Problem und glaube das man das sicher mit mySQL lösen kann. Weis aber nicht wie.

Folgende Abfrage:
SELECT system, error, COUNT (error) FROM errTab where test_id = 16
GROUP BY error, system

Ergibt diese Tabelle
system error count(error)
------ ----- ------------
WINXP #1 156
WINXP #2 35
WINXP #3 65
WINXP #4 122
Vista #1 117
Vista #2 45
Vista #3 36
Vista #4 87
WIN7 #1 61
WIN7 #2 19
WIN7 #3 51
WIN7 #4 78


nun möchte ich das ergebnis aber so haben:
system ERR #1 ERR #2 ERR #3 ERR #4 ERR ALL
------ ----- ----- ----- ----- ------------
WINXP 156 35 65 122 378
Vista 117 45 36 87 285
WIN7 61 19 51 78 209

Geht das direkt in mySQL oder nur über den Umweg einer Programmiersprache (Aktuell mach ich das in PHP)

LG NetBu||
 
Kreuztabellen gehen nur klar definiert in Kombination von SUM() und IF()
SQL:
SELECT 
	system, 
	SUM(IF(error='#1', 1, 0)) AS `err #1`,
	SUM(IF(error='#2', 1, 0)) AS `err #2`,
	SUM(IF(error='#3', 1, 0)) AS `err #3`,
	SUM(IF(error='#4', 1, 0)) AS `err #4`,
	COUNT (error) AS `err all`
FROM 
	errTab 
WHERE 
	test_id = 16
GROUP BY
	system;
 
Zuletzt bearbeitet von einem Moderator:
OK, das is cool. aber in dem Fall muss ich jeden Error definieren. Wenn also ein neuer Error-Eintrag hinzukommt, müsste ich das Query anpassen. Geht das auch dynamisch, das wenn neue Fehlertypen hinzukommen die nicht jedesmal in den queries angepasst werden müssen?
 
Du kannst in PHP die Errors analysieren und dann das SQL entsprechend zusammensetzen

PHP:
$sql = "SELECT DISTINCT error FROM errTab ORDER BY error";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
	$fields[] = "SUM(IF(error='{$row['error']}', 1, 0)) AS `err #{$row['error']}`, ";
}
$errFiields = implode('', $fields);
$sql = "
SELECT 
    system, 
    {$errFields}
    COUNT (error) AS `err all`
FROM 
    errTab 
WHERE 
    test_id = 16
GROUP BY
    system;"
 
danke Dir...
wenn ich nun so was will:

error 1 |error 2
OS | date | time | count |date time count
win xp |

Also das die Auswertungen darstellerisch je nach Fehler in einer anderen Spalte stehen.
 
Problem steht immer noch, da ich immer wieder auf diese Problem stosse.
Ich versuche das mal anhand von Beispielen zu erläutern. Vielleicht hat jemand eine coole Lösung die mir noch nicht in den Sinn gekommen ist. Natürlich könnte ich das mit PHP Schleifen lösen. Aber mit mySQL direkt als Query wäre es eleganter.

Die Tabelle sieht so aus:
Code:
id	name	typ		tag	wert1	wert2
--------------------------------------
01	name01	typ1	1	11		21
02	name01	typ2	1	12		22
03	name02	typ1	1	13		23
04	name02	typ2	1	14		24
05	name03	typ1	1	15		25
06	name03	typ2	1	16		26
07	name04	typ1	1	17		27
08	name04	typ2	1	18		28
09	name05	typ1	1	19		29
10	name05	typ2	1	20		30
11	name01	typ1	2	21		31
12	name01	typ2	2	22		32
13	name01	typ3	2	23		33
14	name02	typ1	2	24		34
15	name02	typ2	2	25		35
16	name02	typ3	2	26		36
17	name03	typ1	2	27		37
18	name03	typ2	2	28		38
19	name03	typ3	2	29		39
20	name04	typ1	2	30		40
21	name04	typ2	2	31		41
20	name04	typ3	2	32		42
20	name05	typ1	2	33		43
20	name05	typ2	2	34		44
20	name05	typ3	2	35		45

wen ich nun nach Tag 1 abfrage dann soll das Ergebnis so aussehen:
Code:
für tag 1
.			typ1			typ2
name01		wert1	wert2	wert1	wert2
------------------------------------------
name01		11		21		12		22
name02		13		23		14		24
name03		15		25		16		26
name04		17		27		18		28
name05		19		29		20		30

wenn ich aber nach tag 2 abfrage dann soll es so aussehen:
Code:
für tag 2
.			typ1			typ2			typ2
name01		wert1	wert2	wert1	wert2	wert1	wert2
-----------------------------------------------------------
name01		21		31		22		32		23		33
name02		24		34		25		35		26		36
name03		27		37		28		38		29		39
name04		30		40		31		41		32		42
name05		33		43		34		44		35		45

Kann man das direkt in mySQL lösen oder muss ich zwingend mit einem Schleifenkonstrukt arbeiten. Das Problem ist das es sich hier um riesige Tabellen handelt....

cu s00n
NetBu||
 

Neue Beiträge

Zurück