Sql server 有人可以优化这个SQL查询吗

Sql server 有人可以优化这个SQL查询吗,sql-server,query-optimization,Sql Server,Query Optimization,我有一个SQL登录表“tblLogins”,它存储每个登录用户的用户ID和登录数据。我需要生成一个图表来显示每天有多少登录。所以我使用下面的脚本[CLASSIC ASP] 是否有任何方法可以在不使用循环和每天查询数据库的情况下获取此信息?正如您所看到的,我用30个查询访问数据库。 预期的输出格式如下: [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,2

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

是否有任何方法可以在不使用循环和每天查询数据库的情况下获取此信息?正如您所看到的,我用30个查询访问数据库。 预期的输出格式如下:

[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][20,30]

即[月日,登录]。我正在研究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 
i=1
varStartDate=DateAdd(“m”、-1,日期)
对于i=1到DayCount
intUserTotal=0

strSQL=“选择IsNull(Count(DISTINCT(userid)),0)作为来自tblLogins的登录名,其中LoginDate>=”“&varStartDate&”和LoginDate创建一个包含结果的表怎么样

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决定要显示的日期范围一样;-)这是显示从一个月前(同一天)到今天的所有内容的版本,按天数排序,但不包括未登录的天数(即未显示的天数为0)


DateAdd(m,-1,GetDate()返回从今天开始一个月的开始日期,但结果显示从1开始的DayOfMonth。如果是从5,6,7等开始的DayOfMonth?登录1 11 2 21 4 18 5 23 6 16 7 16 8 26等------------------应为:5 11 6 21 7 18 8 23 9 16 10 11 26等。。。无法设置。另外,登录名为0的日期如何?我修改了我的方法。但是,你似乎要求太高了,而不是心存感激。嗨,alzaimar,我没有要求。如果你认为我要求的话,很抱歉。这只是在尝试解决方案时出现的一些问题。感谢你在我尝试解决方案时提供的信息然后给你反馈。我会尝试新的mod。很抱歉,你这么说是什么意思?SQL语句和表结构也在那里。
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]