Comment countz-vous les tâches de nombre dans le calendar par jour dans SQL Server?

J'essaye de créer une requête dans SQL Server qui returnnera un nombre de tâches par jour. Si la date de début et de fin d'une tâche est le même jour, elle ne doit en append qu'une seule au count.

Voici un petit exemple de jeu de données:

+----+------------+-------------+ | ID | Start_Date | Finish_Date | +----+------------+-------------+ | 1 | 24-Oct-16 | 24-Oct-16 | | 2 | 24-Oct-16 | 26-Oct-16 | | 3 | 25-Oct-16 | 26-Oct-16 | | 4 | 26-Oct-16 | 27-Oct-16 | | 5 | 26-Oct-16 | 28-Oct-16 | +----+------------+-------------+ 

Voici le résultat attendu:

 +-----------+----------------+ | Date | Count_Of_Tasks | +-----------+----------------+ | 24-Oct-16 | 2 | | 25-Oct-16 | 2 | | 26-Oct-16 | 4 | | 27-Oct-16 | 2 | | 28-Oct-16 | 1 | +-----------+----------------+ 

Quelqu'un peut-il créer un exemple de requête qui peut countr le nombre de tâches par jour?

Merci de votre aide!

Vous avez besoin d'une table de calendar pour le faire

J'ai utilisé le Recursive CTE pour générer les dates entre les dates de début et de fin à la volée. Mais il est toujours préférable d'avoir une table Calendar créée dans la database. Ce sera très utile dans de telles requêtes

 ;with data as ( select * from ( VALUES (1, '2016-10-24 00:00:00', '2016-10-24 00:00:00'), (2, '2016-10-24 00:00:00', '2016-10-26 00:00:00'), (3, '2016-10-25 00:00:00', '2016-10-26 00:00:00'), (4, '2016-10-26 00:00:00', '2016-10-27 00:00:00'), (5, '2016-10-26 00:00:00', '2016-10-28 00:00:00')) tc ([ID], [Start_Date], [Finish_Date]) ),calendar AS (SELECT dates = CONVERT(DATETIME, '24-Oct-16') -- Min Start_Date UNION ALL SELECT dates = Dateadd(DAY, 1, dates) FROM calendar WHERE dates < '28-Oct-16') -- Max Finish_Date SELECT c.dates, Count(s.Start_Date) AS Count_Of_Tasks FROM calendar c LEFT JOIN data s ON c.dates between s.Start_Date and s.Finish_Date Group by c.dates 

Résultat :

 ╔═════════════════════════╦════════════════╗ ║ dates ║ Count_Of_Tasks ║ ╠═════════════════════════╬════════════════╣ ║ 2016-10-24 00:00:00.000 ║ 2 ║ ║ 2016-10-25 00:00:00.000 ║ 2 ║ ║ 2016-10-26 00:00:00.000 ║ 4 ║ ║ 2016-10-27 00:00:00.000 ║ 2 ║ ║ 2016-10-28 00:00:00.000 ║ 1 ║ ╚═════════════════════════╩════════════════╝ 

C'est difficile. Une méthode décompose datatables et les réagrège avec une sum en cours:

 select dte, sum(sum(inc)) over (order by dte) as total from ((select start_date as dte, 1 as inc from example ) union all (select dateadd(day, 1, finish_date), -1 as inc from example ) ) e group by dte 
 SELECT DISTINCT(startdate), ( SELECT COUNT(*) FROM tasks AS b WHERE a.startdate BETWEEN b.startdate AND b.enddate ) FROM tasks AS a UNION SELECT DISTINCT(enddate), ( SELECT COUNT(*) FROM tasks AS b WHERE a.enddate BETWEEN b.startdate AND b.enddate ) FROM tasks AS a