PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL Count über mehrere Spalten


aklatte
21.09.2009, 14:33:12
Hallo

ich suche mir schon seit ein paar Stunden die Augen wund, finde aber so richtig keine Lösung, deswegen versuche ich es hier einfach mal.

Ich habe folgende Tabelle, welche ich nicht mehr wirklich verändern kann:

---------------------------------------------------------------------------------------
| ID | KDNR | Montag | Dienstag | Mittwoch | Donnerstag | Freitag | Samstag | Sonntag |
---------------------------------------------------------------------------------------
| 1 | 2012 | 1 | 2 | 3 | 1 | 2 | 1 | 2 |
---------------------------------------------------------------------------------------
| 2 | 2013 | 2 | 1 | 3 | 2 | 3 | 2 | 1 |
---------------------------------------------------------------------------------------
| 3 | 2014 | 1 | 3 | 1 | 3 | 1 | 1 | 3 |
---------------------------------------------------------------------------------------
| 4 | 2015 | 3 | 1 | 2 | 2 | 2 | 2 | 1 |
---------------------------------------------------------------------------------------
| 5 | 2016 | 2 | 2 | 3 | 1 | 3 | 1 | 2 |
---------------------------------------------------------------------------------------
| 6 | 2017 | 1 | 2 | 1 | 2 | 2 | 3 | 2 |
---------------------------------------------------------------------------------------


Jetzt möchte ich eine Abfrage starten welches mir folgendes Ergebnis liefert


----------------------------------------------------------------------------------
| Wert | Montag | Dienstag | Mittwoch | Donnerstag | Freitag | Samstag | Sonntag |
----------------------------------------------------------------------------------
| 1 | 3 | 2 | 2 | 2 | 1 | 3 | 2 |
----------------------------------------------------------------------------------
| 2 | 2 | 3 | 1 | 3 | 3 | 2 | 3 |
----------------------------------------------------------------------------------
| 3 | 1 | 1 | 3 | 1 | 2 | 1 | 1 |
----------------------------------------------------------------------------------


Im Prinzip geht es darum, die Anzahl der jeweiligen Werte per Count zusammen pro Tag auszugeben, sprich am Montag gab es 3x Wert "1", am Dienstag 3x Wert "2" usw.

Mein Anzatz war mit :
SELECT Montag, Count(Montag)
FROM essen
WHERE Woche = '39'
GROUP BY Montag


zu counten, das funktioniert auch (aber nur mit Montag - oder einem anderen einzelnen Tag), wie bekomme ich aber auch die restlichen Tage hin?!

Vielleicht hat jemand einen Ansatz von Euch

Grüße
Alex

mgr
23.09.2009, 10:38:40
Hallo aklatte

ich glaube ohne Stored Procedures oder php kann man dein Problem nicht lösen.

per PHP würde ich das so machen:


foreach($wert = 1;$wert<MAX_WERT;$wert++) {
//SQL ABFRAGE HIER
}


Die SQL-Abfrage würde dann ca. so aussehen :


SELECT
sum(if(Montag = $wert, 1, 0)) as Montag,
sum(if(Dienstag = $wert, 1, 0)) as Dienstag,
sum(if(Mittwoch = $wert, 1, 0)) as Mittwoch,
sum(if(Donnerstag = $wert, 1, 0)) as Donnerstag,
sum(if(Freitag = $wert, 1, 0)) as Freitag,
sum(if(Samstag = $wert, 1, 0)) as Samstag,
sum(if(Sonntag = $wert, 1, 0)) as Sonntag
FROM essen
WHERE Woche = '39'


Mit Stored Procedures kenne ich mich nicht aus, aber im das Prinzip bleibt dasselbe.

Lg
mgr

feuervogel
23.09.2009, 12:15:22
Vielleicht hat jemand einen Ansatz von Euch

Grüße
Alex

ja, mit vielen subselects und einigem gefrickel -- dauert aber dann wahrscheinlich recht lange. kannst du mal eine *.sql datei zum importieren zur verfügung stellen mit den beispieldaten?

aklatte
24.09.2009, 09:34:24
Hallo Zusammen,

ich habe euch mal 100 Beispieldaten angehängt, ich denke das dürfe fürs erste reichen.

Zur Performance ist zu sagen, dass diese hierbei eine untergeordnete Rolle spielt, da die Anwendnung lokal läuft und von der SQL Datenbank nichts anderes abverlangt wird!

LG
Alex

mgr
24.09.2009, 16:51:49
ich bin ja kein SQL-Profi, aber ich glaube für dein Problem gibt es keine pure SQL Lösung.
Du musst entweder ein Skript dazu schreiben, oder einzelne Abfragen machen und die Resultate dann in Excel o.ä. exportieren. Ich glaube das musst du so oder so machen,
wenn du alle Daten von X_W1 bis X_W6 in der Form, wie du in deinem 1. Post beschreiben hast, bekommen willst.

Beispiel:

SELECT
1 as Wert,
sum(if(Mo_W1 = 1, 1, 0)) as Montag,
sum(if(Di_W1 = 1, 1, 0)) as Dienstag,
sum(if(Mi_W1 = 1, 1, 0)) as Mittwoch,
sum(if(Do_W1 = 1, 1, 0)) as Donnerstag,
sum(if(Fr_W1 = 1, 1, 0)) as Freitag,
sum(if(Sa_W1 = 1, 1, 0)) as Samstag,
sum(if(So_W1 = 1, 1, 0)) as Sonntag
FROM essen

union

SELECT
2 as Wert,
sum(if(Mo_W1 = 2, 1, 0)),
sum(if(Di_W1 = 2, 1, 0)),
sum(if(Mi_W1 = 2, 1, 0)),
sum(if(Do_W1 = 2, 1, 0)),
sum(if(Fr_W1 = 2, 1, 0)),
sum(if(Sa_W1 = 2, 1, 0)),
sum(if(So_W1 = 2, 1, 0))
FROM essen

union

SELECT
3 as Wert,
sum(if(Mo_W1 = 3, 1, 0)),
sum(if(Di_W1 = 3, 1, 0)),
sum(if(Mi_W1 = 3, 1, 0)),
sum(if(Do_W1 = 3, 1, 0)),
sum(if(Fr_W1 = 3, 1, 0)),
sum(if(Sa_W1 = 3, 1, 0)),
sum(if(So_W1 = 3, 1, 0))
FROM essen


So kriegst du die Ausgabe, wie du sie gerne hättest.
Den Block musst du dann halt fpr X_W1 bis X_W6 wiederholen. Die Abfragen kannst du dann ja abspeichern und immer wieder verwenden.

Gruss
mgr

aklatte
24.09.2009, 22:48:16
S U P E R !

Das bringt mich um Lichtjahre wieder nach vorne, habe heute schon den ganzen Tag mit SUBSELECTS zugebracht und auch eine Lösung gefunden, aber wer hat schon lust ganze 400 secs auf ein Query zu warten!

Danke noch mal für die S U P E R Hilfe!

Grüße
Alex