PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   CASE THEN Abfragen (http://www.selfphp.de/forum/showthread.php?t=25975)

Tikiwiki 18.01.2017 09:20:06

CASE THEN Abfragen
 
Hallo Gemeinde,

ich hätte eine Problemstellung wozu ich Eure Hilfe benötige (falls das überhaupt so lösbar ist wie ich mir das vorstelle).

Ausgangssituation:
Jede Person muss 3 Aufgaben absolvieren und zu jeder Aufgabe werden Punkte vergeben.
Die Tabelle sieht folgend aus:
persID | f_aufgabeid | status_aufgabe
1 | 1 | 3
1 | 2 | 5
1 | 3 | 2

f_aufgabenid ist die Aufgabennummer 1-3
status_aufgabe ist die Punkteanzahl

Was will ich errreichen
Eine Art Pivot-Darstellung

persID | Aufgabe 1 | Aufgabe 2 | Aufgabe 3
1 | 3 | 5 | 2

Mein Versuch dies abzubilden ist folgender (und das ist anscheinend der falsche Weg)

PHP-Code:

SELECT persidvornamenachnamejahrf_aufgabenidstatus_aufgabe,
(CASE 
WHEN f_aufgabenid 1 THEN status_aufgabe END) AS Aufgabe_1,
(CASE 
WHEN f_aufgabenid 2 THEN status_aufgabe END) AS Aufgabe_2,
(CASE 
WHEN f_aufgabenid 3 THEN status_aufgabe END) AS Aufgabe_3,
FROM `aufgaben_person`
WHERE jahr '2016' 

Als Ausgabe bekomme ich folgende Struktur.

persid | vorname | nachname | jahr | f_aufgabenid | status_aufgabe | Aufgabe_1 | Aufgabe_2 | Aufgabe_3
1 | Max | Muster | 2016| 1 | 3 | 3 | NULL | NULL
1 | Max | Muster | 2016| 2 | 5 | NULL | 5 | NULL
1 | Max | Muster | 2016| 3 | 2 | NULL | NULL | 2

Auch ein SUM(CASE ... oder COUNT(CASE ... bringt nichts oder eines der Felder mit GROUP BY zu gruppieren hilft nichts.

Frage: Wie könnte eine mögliche SQL-Abfrage aussehen um das gewünschte Ergebnis zu erzielen (falls es möglich ist)?

Besten Dank im Voraus und hoffe die Aufgabenstellung ist nachvollziehbar für Euch.

lg
Dietmar

vt1816 18.01.2017 14:39:03

AW: CASE THEN Abfragen
 
Hallo Dietmar,

versuches mal mit:
PHP-Code:

SELECT persidvornamenachnamejahr
(
SELECT status_aufgabe FROM  `aufgaben_personWHERE f_aufgabeid 1) AS Aufgabe_1,
(
SELECT status_aufgabe FROM  `aufgaben_personWHERE f_aufgabeid 2) AS Aufgabe_2,
(
SELECT status_aufgabe FROM  `aufgaben_personWHERE f_aufgabeid 3) AS Aufgabe_3
FROM 
`aufgaben_person`
GROUP BY persid

Ergibt:
Zitat:

persid vorname nachname jahr Aufgabe_1 Aufgabe_2 Aufgabe_3
1 Max Mustermann 2016 3 5 2
Verfeinerung mittels weiterer WHERE-Klauseln einfügen.

Hinweis für die Zukunft:
  • Dateistruktur bitte immer in maschienenlesbarer Form angeben - erspart den Helfenden den Nachbau
  • SQL Statments vor dem posten von Fehlern befreien
  • Jahreszahl sollte numerisch sein

Tikiwiki 19.01.2017 13:17:09

AW: CASE THEN Abfragen
 
Hallo vt1816,

erstmal danke für Deine geschätzte Antwort auf meinen Beitrag und ich werde in Zukunft Deine Anmerkung bez. Darstellung und Lesbarkeit berücksichtigen.

Grundsätzlich funktioniert Dein Vorschlag. Leider nur wen ich eine Person in der Tabelle habe. Wenn ich Deine Abfrage auf die Tabelle mit allen Daten (mehrere Personen mit Aufgaben und Punkten) umsetze bekomme ich eine Fehlermeldung

Code:

#1242 - Subquery returns more than 1 row
Du schreibst ich kann Verfeinerungen durch weitere WHERE-Klauseln machen. Nur wüsste ich nicht wo?

Hier nochmals den Tabellenaufbau und Testdaten

Code:

CREATE TABLE IF NOT EXISTS `testtabelle` (
  `idnr` int(11) NOT NULL AUTO_INCREMENT,
  `persid` int(11) NOT NULL,
  `f_aufgabeid` int(11) NOT NULL,
  `status_aufgabe` int(1) NOT NULL,
  PRIMARY KEY (`idnr`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;


INSERT INTO `testtabelle` (`idnr`, `persid`, `f_aufgabeid`, `status_aufgabe`) VALUES
(1, 1243, 1, 3),
(2, 1243, 2, 1),
(3, 1243, 3, 5),
(7, 4711, 1, 3),
(8, 4711, 2, 7),
(9, 4711, 3, 6);

Ich hoffe Du kannst Dich dieser Problematik nochmals annehmen.
Besten Dank
Dietmar

Tikiwiki 20.01.2017 11:20:36

AW: CASE THEN Abfragen
 
Hallo Gemeinde,

habe die Lösung meines Problems dann doch noch selbst lösen können.

Hier die Lösung:

Code:

SELECT idnr, persid, f_aufgabenid, status_aufgabe,
sum(CASE f_aufgabenid WHEN 1 THEN status_aufgabe ELSE 0 END) as Aufgabe_1,
sum(CASE f_aufgabenid WHEN 2 THEN status_aufgabe ELSE 0 END) as Aufgabe_2,
sum(CASE f_aufgabenid WHEN 3 THEN status_aufgabe ELSE 0 END) as Aufgabe_3
FROM `testtabelle`
GROUP BY persid

Somit für mich abgeschlossen.
Schönen Tag noch
Dietmar

Tikiwiki 26.01.2017 15:13:10

AW: CASE THEN Abfragen
 
Hallo Gemeinde,

ich muss dieses Thema noch einmal aufgreifen, da ich doch noch meine Schweirigkeiten habe ein vernünftiges SQL-Statement zusammen zu bauen.

Die SQL-Abfrage funktioniert und tut was ich möchte
Code:

SELECT idnr, persid, f_aufgabenid, status_aufgabe,
sum(CASE f_aufgabenid WHEN 1 THEN status_aufgabe ELSE 0 END) as Aufgabe_1,
sum(CASE f_aufgabenid WHEN 2 THEN status_aufgabe ELSE 0 END) as Aufgabe_2,
sum(CASE f_aufgabenid WHEN 3 THEN status_aufgabe ELSE 0 END) as Aufgabe_3
FROM `testtabelle`
GROUP BY persid

Ich möchte nun die Tabelle um das Feld "anmerkung" erweitern. Es sollen ja zu der Aufgabe und Punkte ev. Anmerkungen getätigt werden.

Wie könnte die SQL-Abfrage nun aussehen, dass ich dieses Feld in die bestehende integrieren kann?

Code:

SELECT idnr, persid, f_aufgabenid, status_aufgabe,
sum(CASE f_aufgabenid WHEN 1 THEN status_aufgabe ELSE 0 END) AS Aufgabe_1,
(CASE f_aufgabenid WHEN 1 THEN anmerkung ELSE '' END) AS Anmerkung_Aufgabe_1,
sum(CASE f_aufgabenid WHEN 2 THEN status_aufgabe ELSE 0 END) as Aufgabe_2,
(CASE f_aufgabenid WHEN 2 THEN anmerkung ELSE '' END) AS Anmerkung_Aufgabe_2,
sum(CASE f_aufgabenid WHEN 3 THEN status_aufgabe ELSE 0 END) as Aufgabe_3,
(CASE f_aufgabenid WHEN 3 THEN anmerkung ELSE '' END) AS Anmerkung_Aufgabe_3,
FROM `testtabelle`
GROUP BY persid

Dies funktioniert so nicht. Aber zur Erklärung wenn f_aufgabenid 1 ist und in den Anmerkungen was steht soll er dies anzeigen ansonsten eine leere Ausgabe.

Über eine Hilfestellung zu diesem Thema wäre ich Euch dankbar.
lg
Dietmar

Tikiwiki 01.02.2017 08:59:34

AW: CASE THEN Abfragen
 
Hallo,

das Problem besteht leider immer noch. Wenn man das zusätzliche Feld "Anmerkungen" in dieser Form der Abfrage, wie in den vorigen Posts beschrieben, nicht unterbringen kann, würde ich mich doch über andere Ansätze von Euch freuen.

Besten Dank
Dietmar


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:56:47 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.