2016-10-04 169 views
4

我試圖讓用戶的30天報告,將返回日期用戶作爲計數在該日期創建的總數和我這個做的查詢SQL:與用戶每日報告統計

Select count(*) As [Count] , 
     (SELECT CONVERT(date, AddDate)) As [Date] 
from Users 
WHERE AddDate >= (SELECT DateAdd(month, -1, Convert(date, GetDate()))) 
Group By CONVERT(date, AddDate) 

它給我的只有在其創建的任何用戶的日期,但我想告訴所有30天無論它是否有計數

相同的情況我想用月度報告。 我正在創建用戶的月份,現在我想將其更改爲獲得最近12個月從本月開始,他們的總用戶數。對於這正如我在評論中提及了我使用此查詢

Select count(*) As [Count] , 
     (Select DATEPART(month , DateAdd(month , DATEPART(mm,AddDate) , -1))) as Month 
from Users 
WHERE AddDate >= (SELECT DateAdd(YEAR, -1, Convert(date, GetDate()))) 
Group By DATEPART(mm,AddDate) 
+2

你需要一個'日曆表'和'左加入' –

回答

2

,你需要一個Calendar tableLeft Join

SELECT Count(u.adddate) AS [Count], 
     c.dates AS [Date] 
FROM calendar_table C 
     LEFT JOIN users U 
       ON c.dates = CONVERT(DATE, adddate) 
WHERE c.dates >= Dateadd(month, -1, CONVERT(DATE, Getdate())) 
GROUP BY c.dates 

要生成/創建日曆表或日期檢查出以下問題

How to generate a range of dates in SQL Server

Generate Dates between date ranges

How to create a Calender table for 100 years in Sql

+0

日曆表是矯枉過正。爲什麼不是30天的日曆CTE? – JohnHC

+0

@JohnHC - 這個想法是日曆表不是完全的日曆表 –

3

使用日曆CTE:

With NumberSequence (Number) as 
(
    Select 1 as Number 
    union all 
    Select Number + 1 
    from NumberSequence 
    where Number <= 30 
) 
, CalendarCTE as 
(
    select cast(dateadd(dd, -30 + Number,getdate()) as Date) as CalDate 
    from Numbersequence 
) 

select CalDate, count(U1.*) as CountUsers 
from CalendarCTE 
left join Users U1 
on CalDate = convert(date, U1.AddDate) 
group by CalDate 
+0

投了列'CalDate'日期,其他明智這還會返回時間部分。 –

2

試試這個腳本:

WITH CTEDates 
AS 
(
    SELECT CAST(GetDate() as date) AS [date] 
    UNION ALL 
    SELECT DATEADD(dd, 1, [date]) 
    FROM CTEDates 
    WHERE DAY([date]) <= 30 
) 
Select count(*) As [Count] ,CONVERT(date, AddDate) As [Date] 
from CTEDates 
LEFT JOIN Users ON CTEDates.date=CONVERT(date, AddDate) 
WHERE AddDate >= DateAdd(month, -1, GetDate()) 
Group By CONVERT(date, AddDate) 
+0

CTE不起作用。這是需要限制的增量,而不是日期。否則,10月31日不會出現... – JohnHC

+0

好吧,很高興知道這件事,但這會給10月31日,我已經測試了它,然後發佈答案:) –

1

可以使用CTE獲得三十天日曆。然後將您的用戶表添加到它。

DECLARE @CurrentTime DATETIME = GETDATE() 
;WITH CTE AS 
    (
     SELECT CONVERT(DATE, @CurrentTime) AS [Date] 

     UNION ALL 

     SELECT DATEADD(dd, -1, Date) 
     FROM CTE 
     WHERE DATEADD(dd, 29, Date) > @CurrentTime 
    ) 
SELECT COUNT(U.AddDate) AS [Count] 
, CTE.[Date] AS [Date] 
FROM CTE 
LEFT JOIN users U 
ON CTE.Date = CONVERT(Date, AddDate) 
GROUP BY CTE.Date 

您可以使用類似的CTE來獲取十二個月的日曆並使用相同的連接來計數。

HTH。

1
DECLARE @StartDate Datetime 
DECLARE @EndDate Datetime 

CREATE TABLE #tMyCalanderDate (dtDate Datetime Primary key) 

SELECT @StartDate = '01-Sep-2016' 
SELECT @EndDate = '30-Sep-2016' 

WHILE @StartDate <= @EndDate 
BEGIN 
    INSERT INTO #tMyCalanderDate (dtDate) 
    SELECT @StartDate 

    SELECT @StartDate = DATEADD(day,1,@StartDate) 

END 

SELECT count(A.UserID) As [Count] , B.dtDate As [Date] 
FROM Users AS A 
RIGHT JOIN #tMyCalanderDate AS B ON CONVERT(date, A.AddDate) = CONVERT(date, B.dtDate) 
WHERE CONVERT(date, A.AddDate) BETWEEN @StartDate AND @EndDate 
Group By CONVERT(date, B.dtDate)