J'ai beaucoup de mal à rédiger une requête que je pensais assez simple. J'ai une table qui enregistre le nombre total d'heures passées sur une tâche et l'utilisateur qui a déclaré ces heures. J'ai besoin de créer une requête qui renvoie le nombre d'heures qu'un utilisateur donné a facturé pour chaque semaine de l'année (y compris les semaines où aucune heure n'a été facturée).
Résultats attendus :
|USER_ID | START_DATE | END_DATE | HOURS |
-------------------------------------------
|'JIM' | 4/28/2019 | 5/4/2019 | 6 |
|'JIM' | 5/5/2019 | 5/11/2019 | 0 |
|'JIM' | 5/12/2019 | 5/18/2019 | 16 |
J'ai une fonction qui renvoie la date de début et de fin de la semaine pour chaque jour. J'ai donc utilisé cette fonction et l'ai jointe au tableau des tâches par date et j'ai additionné les heures. J'ai donc utilisé cette fonction et l'ai jointe à la table des tâches par date et j'ai additionné les heures. Cela me rapproche beaucoup, mais comme je joins sur la date, je me retrouve évidemment avec NULL pour l'USER_ID sur toutes les lignes d'heures nulles.
Sortie de courant :
|USER_ID | START_DATE | END_DATE | HOURS |
-------------------------------------------
|'JIM' | 4/28/2019 | 5/4/2019 | 6 |
| NULL | 5/5/2019 | 5/11/2019 | 0 |
|'JIM' | 5/12/2019 | 5/18/2019 | 16 |
J'ai essayé plusieurs autres approches, mais à chaque fois je me heurte au même problème. Des idées ?
Schéma :
---------------------------------
| TASK_LOG |
---------------------------------
|USER_ID | DATE_ENTERED | HOURS |
-------------------------------
|'JIM' | 4/28/2019 | 6 |
|'JIM' | 5/12/2019 | 6 |
|'JIM' | 5/13/2019 | 10 |
------------------------------------
| DATE_HELPER_TABLE |
|(This is actually a function, but I|
| put it in a table to simplify) |
-------------------------------------
|DATE | START_OF_WEEK | END_OF_WEEK |
-------------------------------------
|5/3/2019 | 4/28/2019 | 5/4/2019 |
|5/4/2019 | 4/28/2019 | 5/4/2019 |
|5/5/2019 | 5/5/2019 | 5/11/2019 |
| ETC ... |
Requête :
SELECT HRS.USER_ID
,DHT.START_OF_WEEK
,DHT.END_OF_WEEK
,SUM(HOURS)
FROM DATE_HELPER_TABLE DHT
LEFT JOIN (
SELECT TL.USER_ID
,TL.HOURS
,DHT2.START_OF_WEEK
,DHT2.END_OF_WEEK
FROM TASK_LOG TL
JOIN DATE_HELPER_TABLE DHT2 ON DHT2.DATE_VALUE = TL.DATE_ENTERED
WHERE TL.USER_ID = 'JIM1'
) HRS ON HRS.START_OF_WEEK = DHT.START_OF_WEEK
GROUP BY USER_ID
,DHT.START_OF_WEEK
,DHT.END_OF_WEEK
ORDER BY DHT.START_OF_WEEK
http://sqlfiddle.com/#!18/02d43/3 (note : pour cette astuce sql, j'ai converti ma fonction d'aide de date en un tableau pour simplifier)