有人可以优化此SQL查询

时间:2013-03-05 10:01:54

标签: sql-server query-optimization

我有一个SQL Logins表“tblLogins”,它为每个登录用户存储UserId和LoginDate。我需要生成一个图表来显示每天有多少登录。所以我在[CLASSIC ASP]下面使用这个脚本。

有没有办法让这些信息没有循环并每天查询数据库?正如您所看到的,我正在使用30个查询来访问数据库。 OUTPUT FORMAT预计是这样的:

[[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很接近,但仍有一些问题。

1 个答案:

答案 0 :(得分:0)

如何使用结果àla

创建表格
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

如果你想查看没有登录的日期,你必须创建一个包含当天所有日子的表格,然后将此表格与上述结果一起加入。

然后,您可以将结果连接成一个字符串。如何做到这一点的示例显示为here

编辑:当詹姆斯决定要显示的日期范围;-)这里的版本显示从一个月前(同一天)到今天的所有内容,按天数排序,但不包括没有登录的天数(即他们没有表现出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]