0

ログインする各ユーザーのUserIdとLoginDateを格納するSQLログインテーブル「tblLogins」があります。毎日のログイン数を示すグラフを生成する必要があります。そこで、[CLASSIC ASP] の下でこのスクリプトを使用します。

毎日ループしてデータベースにクエリを実行せずにこの情報を取得する方法はありますか? ご覧のとおり、30 個のクエリで DB にアクセスしています。期待される出力フォーマットは次のとおりです。

[[1, 26], [2, 16], [3, 16], [4, 26], [5, 0], [6, 0], [7, 25], [8, 21], [ 9、90]、[10、12]、[11、11]、[12、21]、[13、0]、[14、18]、[15、17]、[16、21]、[17、 23]、[18、19]、[19、0]、[20、0]、[21、12]、[22、17]、[23、12]、[24、7]、[25、11] 、[26、21]、[27、0]、[28、18]、[29、20]、[30、0]]

これは [月の日、ログイン] です。SQL Server で COALESCE を見ていましたが、それが可能かどうかわからず、使用法もよくわかりません。

コード:

    i=1
    varStartDate =  DateAdd("m",-1, Date) 
    for i = 1 to DayCount
    intUserTotal = 0

    strSQL= "Select IsNull(Count(DISTINCT(userid)),0) as Logins from tblLogins where LoginDate >= '"& varStartDate &"' and LoginDate <= '"& DateAdd("d", 1, varStartDate) &"'



    rsTemp.Open strSQL,objConn,3,2
    if not rsTemp.EOF then
        if not isnull(rsTemp("Logins")) and trim(rsTemp("Logins")) <> "" then
          intUserTotal = trim(rsTemp("Logins"))
        else
          intUserTotal = 0
        end if
    else
        intUserTotal = 0
    end if
    rsTemp.close
    '' append in JSON FORMAT
    strData1= strData1 & "[" & i & ", "  & cInt(intUserTotal) & "], "
    ''' increment the date
    varStartDate =  DateAdd("d",1, varStartDate) 
    '' start with next date
    next 

編集:一部の日にログインがない場合があるため、結果はその月の結果で 0 を報告する必要があります。@alzaimar は近いですが、まだいくつかの問題があります。

4

1 に答える 1

0

結果をまとめた表を作成してみてはいかがでしょうか

declare @FirstOfMonth DateTime

set @FirstOfMonth = DateAdd(d, -DatePart(Day, GetDate())+1, getdate())
set @FirstOfMonth = Cast(floor(Cast(@FirstOfMonth as float)) as DateTime)

select datepart (day,LoginDate) as DayOfMonth, 
       Count(distinct UserID)
  from tblLogins 
 where LoginDate >= @FirstOfMonth
group by datepart (day,LoginDate)
order by 1

また、ログインのない日付も表示したい場合は、その日のすべての日を含むテーブルを作成し、このテーブルを上記の結果に結合したままにする必要があります。

その後、結果を文字列に連結できます。これを行う方法の例をここに示します

編集: James が表示する日付範囲について決心したので ;-) これは、1 か月前 (同じ日) から今日までのすべてを表示するバージョンです。表示は 0 でした)。

select LoginDay, 
       Logins
  from (
  select  Cast(floor(Cast(LoginDate as float)) as DateTime) as SortDate,
          max(DatePart(d,LoginDate)) as LoginDay,
          Count(distinct UserID) as Logins
     from tblLogins
    where LoginDate >= DateAdd(m,-1, GetDate())
 group by Cast(floor(Cast(LoginDate as float)) as DateTime)
 ) x
 order by [SortDate]
于 2013-03-05T10:28:13.813 に答える