CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
18.01.2017, 09:20:06
|
Anfänger
|
|
Registriert seit: Apr 2005
Beiträge: 115
|
|
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 persid, vorname, nachname, jahr, f_aufgabenid, status_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
|
18.01.2017, 14:39:03
|
|
Administrator
|
|
Registriert seit: Jul 2004
Beiträge: 3.707
|
|
AW: CASE THEN Abfragen
Hallo Dietmar,
versuches mal mit:
PHP-Code:
SELECT persid, vorname, nachname, jahr,
(SELECT status_aufgabe FROM `aufgaben_person` WHERE f_aufgabeid = 1) AS Aufgabe_1,
(SELECT status_aufgabe FROM `aufgaben_person` WHERE f_aufgabeid = 2) AS Aufgabe_2,
(SELECT status_aufgabe FROM `aufgaben_person` WHERE 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
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert
Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!
Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
|
19.01.2017, 13:17:09
|
Anfänger
|
|
Registriert seit: Apr 2005
Beiträge: 115
|
|
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
|
20.01.2017, 11:20:36
|
Anfänger
|
|
Registriert seit: Apr 2005
Beiträge: 115
|
|
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
|
26.01.2017, 15:13:10
|
Anfänger
|
|
Registriert seit: Apr 2005
Beiträge: 115
|
|
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
|
01.02.2017, 08:59:34
|
Anfänger
|
|
Registriert seit: Apr 2005
Beiträge: 115
|
|
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
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 04:55:40 Uhr.
|