0

我有一个任务表,其中有特定日期的记录。我想让一个月内的所有日期显示每个日期的任务数。如果在某个日期没有任务记录,则应写为 0。

当某一天有任务时,我有从同一日期复制记录的结果。

桌子:

Date        Tasks
2021-08-01  0
2021-08-02  0
2021-08-03  0
2021-08-03  25
2021-08-04  0
2021-08-04  18
2021-08-05  0
2021-08-05  31
2021-08-06  0

我正在使用的 SQL 代码:

Declare @year int = 2021, @month int = 8;
WITH numbers 
as 
( 
    Select 1 as value 
    UNion ALL 
    Select value +1 from numbers 
    where value + 1 <= Day(EOMONTH(datefromparts(@year, @month, 1)))
) 
SELECT datefromparts(@year, @month, numbers.value) AS 'Datum', 0 AS 'Tasks' FROM numbers 
UNION 
SELECT CONVERT(date, added_d) AS 'Datum', COUNT(*) AS 'Tasks' FROM Crm.Task 
WHERE YEAR(added_d) = '2021' AND MONTH(added_d) = '8' GROUP BY CONVERT(date, added_d)

我如何删除重复的我只有一个日期记录 21-08-03 和 25 个任务?

谢谢您的帮助

4

2 回答 2

1

您需要OUTER JOIN

WITH numbers as ( 
    Select datefromparts(@year, @month, 1) as value 
    UNION ALL 
    Select DATEADD(DAY, 1, value) as value
    from numbers 
    where value < EOMONTH(value)
) 
select num.value, COUNT(tsk.added_d) AS Tasks
from numbers num left join
     Crm.Task tsk
     on CONVERT(date, tsk.added_d) = num.value
GROUP BY num.value;
于 2021-09-15T10:05:31.603 回答
0

如果你想要一个月的所有日期,你可以这样做:

with dates as (
      select datefromparts(@year, @month, 1) as dte
      union all
      select dateadd(day, 1, dte)
      from dates
      where dte < eomonth(dte)
     )

然后,您可以使用外部联接或子查询将其合并到逻辑中:

with dates as (
      select datefromparts(@year, @month, 1) as dte
      union all
      select dateadd(day, 1, dte)
      from dates
      where dte < eomonth(dte)
     )
select d.dte, count(t.added_d)
from dates d left join
     Crm.Task t
     on convert(date, t.added_d) = d.dte
group by d.dte
order by d.dte;

where通过调整第二个子句中的子句,您可以轻松地将 CTE 的逻辑延长一个月以上。

于 2021-09-15T10:45:30.987 回答