2016-10-04 204 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)