MySQL: Zwei Summen, abhängig von einem 'Schalter'

norbert_pdm

Grünschnabel
Hallo, hallo liebe Lesende,

ich habe eine Tabelle, in welcher eine Startzeit, eine Endzeit und ein 'Schalter' existiert.
Relativ simpel ist es, eine Summe in Abhängigkeit von dem 'Schalter' einzeln über die Zeiten auszugeben.
Hier mal konkret (Minimalbeispiel):
SQL:
starttime|endtime  |fq
-----------------------
15:00:00 |18:00:00 |1
13:00:00 |15:00:00 |

Ich kann jetzt zwei Abfragen starten. Zum einen:

SQL:
SELECT
    SEC_TO_TIME(SUM(TIME_TO_SEC(endtime) - TIME_TO_SEC(starttime))) AS Zeit
FROM
    gruppen
WHERE
    tbl_doku_fq = '1'

und

SQL:
SELECT
    SEC_TO_TIME(SUM(TIME_TO_SEC(endtime) - TIME_TO_SEC(starttime))) AS Zeit
FROM
    gruppen
WHERE
    tbl_doku_fq <> '1'

Ist es nun möglich (die Tabelle enthält ja noch mehr Spalten) beide Abfragen zusammen auszugeben?
Also quasi die erste 'Ergebniszeile' mit =1 und die zweite 'Ergebniszeile' mit <>1?
Ich steh gerade irgendwie auf'm Schlauch...

Vielen Dank für eure Unterstützung und viele Grüße,
Norbert
 

Yaslaw

n/a
Moderator
Es lebe CASE WHEN oder by MySQL auch IF()

IF()
SQL:
SELECT
	SUM(
		IF(
			tbl_doku_fq = '1',
	    	TIME_TO_SEC(endtime) - TIME_TO_SEC(starttime),
	    	0	
	    )
	) as zeit_1,
	SUM(
		IF(
			tbl_doku_fq = '1',
	    	0,
	    	TIME_TO_SEC(endtime) - TIME_TO_SEC(starttime)
	    )
	) as zeit_not_1
FROM ...


CASE WHEN
Sollte bevorzugt werden, da das auch viele andere Datenbanken verstehen
SQL:
SELECT
	SUM(
		CASE 
			WHEN tbl_doku_fq = '1' 
			THEN TIME_TO_SEC(endtime) - TIME_TO_SEC(starttime)
	    	ELSE	
	    END
	) as zeit_1,
	SUM(
		CASE 
			WHEN tbl_doku_fq = '1' 
			THEN 0
	    	ELSE TIME_TO_SEC(endtime) - TIME_TO_SEC(starttime)	
	    END
	) as zeit_not_1
FROM ...
 

norbert_pdm

Grünschnabel
Hallo, hallo Yaslaw,

vielen Dank für deine Antwort!!
Ich schau es mir heute Nachmittag an und geb dann mal nen Feedback... Sieht auf jeden Fall erst mal so aus, wie das was ich suchte... :) :)
Viele Grüße,
Norbert
 

Sempervivum

Erfahrenes Mitglied
Meine Version:
Code:
SELECT
    (CASE WHEN fq = 0 THEN "0" ELSE "1" END) as fq2,
    SEC_TO_TIME(SUM(TIME_TO_SEC(endtime) - TIME_TO_SEC(starttime))) AS Zeit
FROM
    gruppen
GROUP BY fq2
liefert zwei Datensätze. Ist es das, was der TO sich wünscht?
 

Yaslaw

n/a
Moderator
Jetzt kommt es drauf an, was er braucht.
Meine Lösung: Eine Zeile mit beiden Werten in verschiedenen Spalten,
Sempervivums Lösung: Zwei Zeilen
 

norbert_pdm

Grünschnabel
Hallo Yaslaw, hallo Sempervivum,

die IF - Abfrage von Yaslaw ist genau das, was ich gesucht habe!!
Sie liefert mir die beiden unterschiedlichen Summen:
1612900516843.png
Allerdings musste ich noch eine kleine Anpassung vornehmen (SEC_TO_TIME):
SQL:
SELECT
    SEC_TO_TIME(SUM(
        IF(
            tbl_doku_fq = '1',
            TIME_TO_SEC(tbl_doku_endtime) - TIME_TO_SEC(tbl_doku_starttime),
            0   
        )
    )) as zeit_1,
    SEC_TO_TIME(SUM(
        IF(
            tbl_doku_fq = '1',
            0,
            TIME_TO_SEC(tbl_doku_endtime) - TIME_TO_SEC(tbl_doku_starttime)
        )
    )) as zeit_not_1
FROM
    tbl_doku_gruppen
WHERE
    DATE_FORMAT(tbl_doku_date, '%m') = MONTH(NOW())
    AND
    tbl_gruppe_ID = '1';

Die CASE Geschichte liefert bei mir (oder MySQL ??) leider immer einen Fehler:

Code:
#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei ')) as zeit_1,
    SEC_TO_TIME(SUM(
        CASE
            WHEN tbl_doku_fq = '1'
            THEN 0' in Zeile 8

Die CASE - Abfrage (angepasst) von Sempervivum,
SQL:
SELECT
    (CASE WHEN tbl_doku_fq <> 1 THEN "0" ELSE "1" END) as fq2,
    SEC_TO_TIME(SUM(TIME_TO_SEC(tbl_doku_endtime) - TIME_TO_SEC(tbl_doku_starttime))) AS Zeit
FROM
    tbl_doku_gruppen
WHERE
    DATE_FORMAT(tbl_doku_date, '%m') = MONTH(NOW())
    AND
    tbl_gruppe_ID = '1'
GROUP BY fq2

liefert leider 'nur':

1612900822530.png

Ich danke euch auf jeden Fall sehr für eure Hilfen!!!
VG, Norbert
 

norbert_pdm

Grünschnabel
Mal noch eine Nachfrage...

Wenn ich eine einzelne Zeile mit einer einzelnen Spalte als Ergebnis erhalte, kann ich diese in PHP mit einer IF -Abfrage ausgeben. Zum Beispiel:


PHP:
if($result_sollstunden = $mysqli_new -> query($query_sollstunde_einzeln)) {
    echo "<b> " . $result_sollstunden -> fetch_object() -> Sollstunden . "</b>\r\n";
}
$result_sollstunden -> close();

Wenn ich nun versuche die einzelne Zeile mit zwei Spalten auszugeben:
PHP:
if($result_iststunden = $mysqli_new -> query($query_doku_iststunden)) {
    $tmp_f_stunden = $result_iststunden -> fetch_object() -> Zeit_F;
    $tmp_q_stunden = $result_iststunden -> fetch_object() -> Zeit_Q;
}
$result_iststunden -> close();

erhalte ich folgenden Fehler:
Notice: Trying to get property 'Zeit_Q' of non-object in D:\xampp....

Kann man das Ergebnis einer Abfrage, welche aus mehreren Spalten besteht nur mit WHILE ausgeben?
Auch wenn definitiv sicher ist, dass es nur eine Zeile gibt?

Danke schon mal wieder und viele Grüße,
Norbert
 

norbert_pdm

Grünschnabel
Ich hab meinen Fehler gefunden...
Wenn es interessiert:

PHP:
if($result_iststunden = $mysqli_new -> query($query_doku_iststunden)) {
    $row = $result_iststunden -> fetch_object();
    $tmp_f_stunden = $row -> Zeit_F;
    $tmp_q_stunden = $row -> Zeit_Q;
}

Denkfehler meinerseits... ;-)
 

norbert_pdm

Grünschnabel
Und doch noch ein Update... ;-)

Nachdem ich nun versucht habe, die Zeiten zu addieren, bin ich genau wieder an dem Original von Yaslaw gelandet... :LOL::LOL:
Ich übergebe jetzt die Zeit in Sekunden an PHP und formatiere da... ;)

Also noch mal Danke an euch!!