1

UsersID過去 7 日間の合計ログイン数 ( ) を数えています。この日付範囲と日付ごとにグループ化されたユーザー ID の総数を数えます。私の問題は、日付に記録されたユーザー ID がない場合、日付が表示されないことです。

したがって、ログインがなかった日付には 0 を表示する必要があります。

私のコードは次のとおりです。

SET @StartDate = CONVERT(varchar(10),DATEADD(day,-7, GETDATE()), 101) +  ' 00:00.00';
SET @EndDate = DATEADD(day,7, @StartDate);

SELECT CONVERT(DATE, [DateTime]) as LoginDate, COUNT(UsersID) AS TotalForDay
FROM [STATS].[dbo].[UsersLogin]
WHERE [DateTime]>@StartDate 
AND [DateTime]<@EndDate
GROUP BY CONVERT(DATE, [DateTime])
ORDER BY LoginDate desc;
4

3 に答える 3

5

日付値を含む別のテーブルが必要です。これを試してください

DECLARE @startdate datetime, @enddate datetime
SET @StartDate = CONVERT(varchar(10),DATEADD(day,-7, GETDATE()), 101) +  ' 00:00.00';
SET @EndDate = DATEADD(day,7, @StartDate);
;with cte as
(
    select @startdate DateValue
    union all
    select DateValue + 1
    from    cte   
    where   DateValue + 1 < @enddate
)


select a.DateValue as LoginDate,  COUNT(UsersID) AS TotalForDay
from cte a
LEFT outer join [STATS].[dbo].[UsersLogin] b 
on CONVERT(varchar(15), a.DateValue,101) = CONVERT(varchar(15), b.[DateTime],101)
group by a.DateValue
order by a.DateValue desc

時間ごとにグループ化する場合:

DECLARE @startdate datetime, @enddate datetime
SET @StartDate = CONVERT(varchar(10),DATEADD(day,-7, GETDATE()), 101) +  ' 00:00.00';
SET @EndDate = DATEADD(day,7, @StartDate);
;with cte as
(
    select @startdate DateValue
    union all
    select DATEADD (hh,1,DateValue)
    from    cte   
    where   DATEADD (hh,1,DateValue) < @enddate
)


select a.DateValue as LoginDate,  COUNT(UsersID) AS TotalForDay
from cte a
LEFT outer join [STATS].[dbo].[UsersLogin] b 
on CONVERT(varchar(15), a.DateValue,101) = CONVERT(varchar(15), b.[DateTime],101)
group by a.DateValue
order by a.DateValue desc
OPTION (MAXRECURSION 0) 
于 2013-03-06T14:40:28.113 に答える
0

テーブルとして静的に実装されているか、サブクエリとして動的に実装されているかに関係なく、Calendar リレーションに対して日付の左結合を行う必要があります。

SET @StartDate = CONVERT(varchar(10),DATEADD(day,-7, GETDATE()), 101) +  ' 00:00.00';
SET @EndDate = DATEADD(day,7, @StartDate);

SELECT C.Date, COUNT(UsersID) AS TotalForDay
FROM Calendar as C
LEFT JOIN [STATS].[dbo].[UsersLogin] as U on C.Date = CONVERT(DATE, [DateTime])       
WHERE [DateTime]>@StartDate 
AND [DateTime]<@EndDate
GROUP BY CONVERT(DATE, [DateTime])
ORDER BY LoginDate desc;
于 2013-03-06T14:41:08.160 に答える
0

これを使用するよりも簡単な必要がある場合。一時テーブル変数を作成し、開始から終了までの日付を追加します。

Declare @temp_Dates Table
(
  TempDate datetime
)

While (@StartDate<@EndDate)
Begin
  Insert Into @temp_Dates Select @EndDate
  Set @EndDate=DATEADD(DAY,-1,@EndDate)
End

その後、上記のテーブルと左結合します。

SELECT Cast(Convert(varchar(20),td.TempDate,101) as DateTime) as LoginDate,     COUNT(UsersID) AS TotalForDay
FROM @temp_Dates td
Left Join  UsersLogin ul On Cast(Convert(varchar(20),ul.DateTime,101) as     DateTime)=Cast(Convert(varchar(20),td.TempDate,101) as DateTime)
GROUP BY Cast(Convert(varchar(20),td.TempDate,101) as DateTime)
ORDER BY LoginDate desc

ご希望の結果が得られます。

于 2013-03-06T14:58:40.687 に答える