2016-10-04 4 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 table

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 

Left Joinを生成するために/カレンダーテーブルを作成したり、日付は以下の質問をチェックアウトする必要がある

How to generate a range of dates in SQL Server

Generate Dates between date ranges

カレンダーCTE使用

How to create a Calender table for 100 years in Sql

+0

カレンダーテーブルが過剰です。 30日のカレンダーCTEはなぜでしょうか? – JohnHC

+0

@JohnHC - アイデアはまったくカレンダーテーブルではありません。 –

3

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'列をDateにキャストします。これ以外の場合は、これも時間部分を返します。 –

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日を与えるでしょう、私はAnsを投稿する前にそれをテストしました:) –

1

あなたは30日の予定表を取得するためにCTEを使用することができます。その後、Usersテーブルを左に継承します。

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を使用して12か月のカレンダーを取得し、同じ結合を使用してカウントを取得することができます。

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) 
関連する問題