我有一個任務表,其中有某個特定日期的記錄。我想把一個月內的所有日期與每個日期的任務數顯示出來。如果在某個日期沒有任務記錄,就應該寫成0。
當某一天有任務時,我的結果是同一日期的記錄重復。
表:
Date Tasks
20210801 0
20210802 0
2021-08-03 0
2021-08-03 25
20210804 0
2021-08-04 18
202108-05 0
2021-08-05 31
20210806 0
我正在使用的SQL代碼:
Declare @year int = 2021, @month int = 8;
WITH 數字
as
(
選擇 1 作為 價值
UNION ALL
選擇 值 1 from 數字
where value 1 < = Day(EOMONTH(datefromparts(@year, @month, 1) )
)
SELECT datefromparts(@ year, @ month, numbers. value) AS 'Datum', 0 AS 'Tasks' FROM digital
UNION
SELECT CONVERT(date, added_d) as 'Datum', COUNT(*) AS 'Tasks' FROM Crm. 任務
WHERE YEAR(added_d) = '2021' AND MONTH(added_d) = '8' GROUP BY CONVERT(date, 添加_d)
我怎樣才能洗掉重復的內容,使我只有一條日期記錄21-08-03和25個任務?
謝謝你的幫助
uj5u.com熱心網友回復:你需要OUTER JOIN :
WITH numbers as (
Select datefromparts(@ year, @ month, 1) asvalue
UNION ALL
Select DATEADD(DAY, 1, value) as value
from數字
where value </span> EOMONTH(value)
)
select num.value, COUNT(tsk.added_d) AS Tasks
from numbers numleft join
Crm.Task tsk
on CONVERT(date, tsk.add_d) = num.value
GROUP BY num.value。
uj5u.com熱心網友回復:
如果你想要一個月內的所有日期,你可以這樣做:
with dates as (
select datefromparts(@年, @月, 1) as dte
union all all
select dateadd(day, 1, dte)
from日期
where dte </span> eomonth(dte)
)
然后你可以使用外層連接或子查詢將其納入邏輯中:
你可以使用外層連接或子查詢。
with dates as (
select datefromparts(@年, @月, 1) as dte
union all all
select dateadd(day, 1, dte)
from日期
where dte </span> eomonth(dte)
)
select d.dte, count(t.added_d)
from dates d leftjoin
Crm.Task t
on convert(date, t.added_d) = d.dte
group by d.dte
order by d.dte。
通過調整第二個子句中的where子句,你可以輕松地將CTE的邏輯擴展到一個以上的月份。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/307263.html
標籤:
