getreidemuehlen
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 29.05.2008, 13:26   #1
TP-Moderator
 
Benutzerbild von Levis
 
Registriert seit: Jul 2001
Ort: Regensburg / Landshut
Levis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKE

SQL-Query: Lücken füllen


Hi,

ich sitze jetzt schon ewig dran und bekomms einfach nicht hin

Ich habe eine Tabelle zur Zeiterfassung:
times(uid, start_time, end_time, task_id)
uid ist der identifizierende Username.

Jetzt brauche ich eine Übersicht, wieviel Sekunden ein User pro Monat an einem Task gearbeitet hat. Dies erreiche ich folgendermaßen:
Code:
SELECT DATE_FORMAT(start_time, '%Y-%c') AS time, 
    times.uid, 
    times.task_id, 
    SUM(1.0 * time_to_sec(end_time) - time_to_sec(start_time)) AS duration 
FROM ts_times times 
WHERE times.proj_id=34 AND 
   times.start_time>='2008-03-01' AND times.end_time<'2008-06-01' 
GROUP BY time, uid, task_id
ORDER BY time, uid, task_id
Jetzt soll die Übersicht allerdings für einen späteren automatischen Export nach Excel erweitert werden. Und zwar sollen immer alle Tasks pro Monat jedem User zugewiesen werden, an denen er irgendwann mal in dem angegebenen Zeitraum gearbeitet hat (unten rot markiert). Außerdem soll jeder User in jedem Monat auftreten, falls er mind. einmal in irgendeinem Monat aufgetreten ist (blau markiert).

Beispielausgabe mit aktueller Abfrage:
time | uid | task_id | duration
2008-3 | user1 | 109 | 126900.0
2008-3 | user2 | 107 | 520380.0
2008-3 | user3 | 106 | 36000.0
2008-3 | user3 | 107 | 184800.0
2008-3 | user4 | 106 | 10800.0

2008-4 | user2 | 107 | 114300.0
2008-4 | user3 | 107 | 55500.0

2008-5 | user3 | 107 | 76800.0
2008-5 | user5 | 107 | 65700.0

Beispielausgabe mit gewünschter Abfrage:
time | uid | task_id | duration
2008-3 | user1 | 109 | 126900.0
2008-3 | user2 | 107 | 520380.0
2008-3 | user3 | 106 | 36000.0
2008-3 | user3 | 107 | 184800.0
2008-3 | user4 | 106 | 10800.0
2008-3 | user5 | 107 | 0.0

2008-4 | user1 | 109 | 0.0
2008-4 | user2 | 107 | 114300.0
2008-4 | user3 | 106 | 0.0
2008-4 | user3 | 107 | 55500.0
2008-4 | user4 | 106 | 0.0
2008-4 | user5 | 107 | 0.0

2008-5 | user1 | 109 | 0.0
2008-5 | user2 | 107 | 0.0
2008-5 | user3 | 106 | 0.0
2008-5 | user3 | 107 | 76800.0
2008-4 | user4 | 106 | 0.0
2008-5 | user5 | 107 | 65700.0

Irgendwer eine Idee? Wahrscheinlich braucht man eine zweite SELECT-Abfrage, die man ins FROM einbaut und dann mit JOIN verbindet.. Aber ich habe keine Lösung gefunden

Vielen Dank im Voraus für alle Tipps
__________________
"Programmieren ist eine Kunst"

» Fahrtenbuch genial! ist endlich da! Steuern sparen so einfach wie noch nie!
» QuickShot 3.0 ist endlich da!
» Schöner einkaufen


Red Gold Green - good things come to those who wait...
Levis ist offline   Mit Zitat antworten


Alt 29.05.2008, 20:24   #2
TP-Moderator
 
Benutzerbild von Levis
 
Registriert seit: Jul 2001
Ort: Regensburg / Landshut
Levis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKE
Ich zweifel schon langsam, ob das überhaupt mit einem SQL-Query abzuradeln ist...
Ich hab quasi ein Muster für je eine Zeiteinheit (z.B. Monat). Wenn in einem Monat ein User gar für gar keinen oder nicht für einen bestimmten Task gearbeitet hat, soll als Duration 0 / NULL angegeben werden.

hm, ich komm einfach nicht drauf
__________________
"Programmieren ist eine Kunst"

» Fahrtenbuch genial! ist endlich da! Steuern sparen so einfach wie noch nie!
» QuickShot 3.0 ist endlich da!
» Schöner einkaufen


Red Gold Green - good things come to those who wait...
Levis ist offline   Mit Zitat antworten
Alt 29.05.2008, 20:39   #3
TP-Moderator
 
Benutzerbild von Cybergreek
 
Registriert seit: Nov 2005
Ort: Köln
Cybergreek ist ein richtiges Arbeitstier - DANKECybergreek ist ein richtiges Arbeitstier - DANKECybergreek ist ein richtiges Arbeitstier - DANKECybergreek ist ein richtiges Arbeitstier - DANKECybergreek ist ein richtiges Arbeitstier - DANKE
Ich hoffe, Dir bringt ein Ansatz erstmal was

Ich denke, Du kannst Dein Problem damit lösen, dass Du Deine Abfrage mit einer zweiten verknüpfst. Also (hier kommt der Ansatz):
PHP-Code:
SELECT ...deineAbfrage...
UNION
SELECT 
...
FROM ...
WHERE NOT EXISTS (...eine Abwandlung der ersten Abfrage...)

ORDER BY timeuidtask_id 
Ich hoffe, die Idee ist ein bisschen rübergekommen?
__________________
Grüße vom Griechen,
Cybergreek!

WikiDict.de - Das Wiki-Wörterbuch
Cybergreek ist gerade online   Mit Zitat antworten
Alt 29.05.2008, 21:23   #4
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
also ich denk doch das das mit einer Query geht

also ich würde so vorgehen
Code:
SELECT
uid, DATE_FORMAT(start_time,'%d.%m.%Y') as Datum,
month(start_time) as Monat
sum(UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time) as Sekunden,
task_id
FROM ts_times times
group by Monat, task_id,uid
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 30.05.2008, 00:40   #5
TP-Moderator
 
Benutzerbild von Levis
 
Registriert seit: Jul 2001
Ort: Regensburg / Landshut
Levis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKE
Hi,

danke für Eure Antworten!

steffen, deine Abfrage bringt dasselbe Ergebnis wie meine...
cybergreek: hm... ich befürchte ich habs noch nicht so ganz morgen werd ich darüber mal nachdenken dankeschön!
__________________
"Programmieren ist eine Kunst"

» Fahrtenbuch genial! ist endlich da! Steuern sparen so einfach wie noch nie!
» QuickShot 3.0 ist endlich da!
» Schöner einkaufen


Red Gold Green - good things come to those who wait...
Levis ist offline   Mit Zitat antworten
Alt 30.05.2008, 01:19   #6
TP-Moderator
 
Benutzerbild von Cybergreek
 
Registriert seit: Nov 2005
Ort: Köln
Cybergreek ist ein richtiges Arbeitstier - DANKECybergreek ist ein richtiges Arbeitstier - DANKECybergreek ist ein richtiges Arbeitstier - DANKECybergreek ist ein richtiges Arbeitstier - DANKECybergreek ist ein richtiges Arbeitstier - DANKE
Zitat:
Zitat von Levis Beitrag anzeigen
cybergreek: hm... ich befürchte ich habs noch nicht so ganz ...
Sag das doch gleich, ich drück mich manchmal undeutlich aus

Also es geht in diese Richtung:
PHP-Code:
SELECT DATE_FORMAT(start_time'%Y-%c') AS time
    
times.uid
    
times.task_id
    
SUM(1.0 time_to_sec(end_time) - time_to_sec(start_time)) AS duration 
FROM test times 
WHERE times
.proj_id=34 AND 
   
times.start_time>='2008-03-01' AND times.end_time<'2008-06-01' 
GROUP BY timeuidtask_id

UNION 

SELECT DISTINCT DATE_FORMAT
(start_time'%Y-%c') AS time
  
user.uid,
  
times.task_id,
  
0
FROM test times
,
 (
SELECT DISTINCT DATE_FORMAT(start_time'%Y-%c'FROM testmonths,
 (
SELECT DISTINCT uid FROM testuser
WHERE times
.proj_id=34 
   
AND times.start_time>='2008-03-01' AND times.end_time<'2008-06-01' 
   
AND NOT EXISTS (select from test times2 where user.uid times2.uid and DATE_FORMAT(times.start_time'%Y-%c') = DATE_FORMAT(times2.start_time'%Y-%c'))
   AND 
times.task_id in (select task_id from test times3 where times3.start_time>='2008-03-01' AND times3.end_time<'2008-06-01' AND times3.uid user.uid)
    
ORDER BY timeuidtask_id 
Da ist noch einiges an Optimierungsbedarf da, aber für meinen ersten schnellen Tests schien es korrekt zu laufen.
__________________
Grüße vom Griechen,
Cybergreek!

WikiDict.de - Das Wiki-Wörterbuch
Cybergreek ist gerade online   Mit Zitat antworten
Alt 30.05.2008, 11:19   #7
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
um die Null-Zeiten reinzubekommen wirst Du wohl um einen Join nicht drumrumkommen, da user, die keinen Einterag haben auch nicht in der Tabelle auftauchen.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 30.05.2008, 14:33   #8
TP-Moderator
 
Benutzerbild von Levis
 
Registriert seit: Jul 2001
Ort: Regensburg / Landshut
Levis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKELevis ist ein richtiges Arbeitstier - DANKE
Cybergreeks Ansatz werde ich später versuchen umzubauen. Bis jetzt braucht er 45 Sekunden und das Ergebnis ist auch noch nicht korrekt..

JOINS.. Ich habe schon alles probiert.. LEFT, RIGHT, OUTER..

Danke aber Euch beiden
__________________
"Programmieren ist eine Kunst"

» Fahrtenbuch genial! ist endlich da! Steuern sparen so einfach wie noch nie!
» QuickShot 3.0 ist endlich da!
» Schöner einkaufen


Red Gold Green - good things come to those who wait...
Levis ist offline   Mit Zitat antworten
Alt 30.05.2008, 20:12   #9
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
mach einen kleinen Dump von den 2 Tabellen (zeittabelle und user) und ich bastle was, bin zu faul das alles manuell zu erstellen
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
SQL-Query: Lücken füllen SQL-Query: Lücken füllen
« gallery script hat ein problem | Warenkorb aktualisieren »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:48 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67