Unterschiedliche Zeiträume in eine SELECT Anweisung

darti

Benutzer
Beiträge
11
Hallo,

ich habe hier eine Abfrage, die alle Tickets heraussucht, die am vorherigen Tag bearbeitet wurden. Da wird neben anderen Parametern auch die an diesem Tag für das Ticket aufgewendete Zeit ermittelt. Das ganze sieht stark verkürzt so aus:

Code:
SELECT
ticket.tn as 'Ticket#',
ticket.title as Title,
.
.
ROUND(SUM( time_accounting.time_unit )) as 'Accounted time'
FROM ticket
.
.
WHERE ticket.queue_id NOT IN ( 6 )
.
.
AND UNIX_TIMESTAMP(time_accounting.change_time) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
AND UNIX_TIMESTAMP(time_accounting.change_time) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE))
GROUP BY ticket.id

Ich hätte in dieser Abfrage zusätzlich gerne noch die gesammte aufgewendete Zeit für ein Ticket und nicht nur die vom Vortag. Wie kann ich das in dieser Abfrage unterbringen?

Gruß
Rainer
 
Werbung:
Das sollte z.B. via Subselect gehen. Laß Dir gesagt sein, daß Dein gezeigtes SQL syntaktisch falsch ist und mit MySQL 5.7 sowie allen anderen richtigen Datenbanken nicht funktionieren wird. Alle Spalten des Results müssen entweder aggregiert oder gruppiert sein, gegen diese Regel verstößt Du. Du bekommst ein mehr oder weniger zufälliges, möglicherweise vollständig falsches Ergebnis. MySQL erkennt diesen Fehler (derzeit) nicht.
 
Werbung:
Ich vermute dein Problem läßt sich auch mit einem Subselect nicht sinnvoll lösen. CASE und HAVING sind deine Freunde:
Code:
SELECT
ticket.tn as 'Ticket#',
ticket.title as Title,
.
.
ROUND(SUM( CASE
WHEN UNIX_TIMESTAMP(time_accounting.change_time) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
AND UNIX_TIMESTAMP(time_accounting.change_time) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE))
THEN time_accounting.time_unit
ELSE 0
END )) as 'Accounted time',
ROUND(SUM( CASE
WHEN UNIX_TIMESTAMP(time_accounting.change_time) < UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
OR UNIX_TIMESTAMP(time_accounting.change_time) > UNIX_TIMESTAMP(CAST(NOW() AS DATE))
THEN time_accounting.time_unit
ELSE 0
END )) as 'übrige Zeit'
FROM ticket
.
.
WHERE ticket.queue_id NOT IN ( 6 )
.
.
GROUP BY ticket.id,...
HAVING
ROUND(SUM( CASE
WHEN UNIX_TIMESTAMP(time_accounting.change_time) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
AND UNIX_TIMESTAMP(time_accounting.change_time) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE))
THEN time_accounting.time_unit
ELSE 0
END )) > 0
Du schränkst dich nicht mehr auf Tickets mit entsprechender change_time ein sondern sagst per HAVING das die Summe dieser change_time > 0 sein soll. So werden alle Datensätze berücksichtigt. Per CASE differenzierst du dann welche Zeit in welcher Spalte aufaddiert wird.

Ich hab deine Bedingungen jetzt nur einfach stumpf umgedreht, das geht bestimmt eleganter. Auch könntest du mit BETWEEN arbeiten.
 
Zurück
Oben