Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用空组按日期分组_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

Sql 使用空组按日期分组

Sql 使用空组按日期分组,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我有一个loginAudit表,我正在尝试获取每天所有登录的计数。我想做的是让没有登录的日子返回他们的日子,并且登录计数为0。目前,在没有登录的天数内没有返回任何行 这可能是不可能的,并且在返回查询结果后必须在应用程序中填写空组 SELECT DATEADD(day, DATEDIFF(day,0,LoginAudit.LoginDateTime), 0) as LoginDate, COUNT(DISTINCT LoginAudit.LoginAuditID) AS

我有一个loginAudit表,我正在尝试获取每天所有登录的计数。我想做的是让没有登录的日子返回他们的日子,并且登录计数为0。目前,在没有登录的天数内没有返回任何行

这可能是不可能的,并且在返回查询结果后必须在应用程序中填写空组

  SELECT DATEADD(day, DATEDIFF(day,0,LoginAudit.LoginDateTime), 0) as LoginDate,  
         COUNT(DISTINCT LoginAudit.LoginAuditID) AS Logins  
    FROM LoginAudit 
GROUP BY DATEADD(day, DATEDIFF(day,0,LoginAudit.LoginDateTime), 0)
ORDER BY 1  

您使用的是什么数据库管理系统

如果是Oracle,您可以尝试在子查询中选择日期,如下所示:

SELECT TRUNC(SYSDATE) + 1 - LEVEL AS today,
       TRUNC(SYSDATE) + 2 - LEVEL AS tomorrow
FROM DUAL
CONNECT BY LEVEL <= 30 /* Last 30 days */
那么你可以做:

SELECT today as LoginDate,  
       COUNT(DISTINCT LoginAudit.LoginAuditID) AS Logins  
FROM (
       SELECT TRUNC(SYSDATE) + 1 - LEVEL AS today,
              TRUNC(SYSDATE) + 2 - LEVEL AS tomorrow
       FROM DUAL
       CONNECT BY LEVEL <= 30 /* Last 30 days */
     ),
     LoginAudit 
WHERE LoginAudit.LoginDateTime BETWEEN today AND tomorrow
GROUP BY today
ORDER BY 1

我认为我已经相当彻底地搜索了解决方案,但在发布问题后,我发现了以下链接:


本质上,您所要求的是将您的表加入到日期表中。日期表将没有间隙,您将根据日期值分组。那么如何创建日期表呢

在中,建议在需要连接无间隙序列的情况下保留一个整数表。然后,您可以通过将表连接到它来选择所需的任何序列

因此,如果您有一个整型表,其中的值可以根据需要追溯到几天之后,您可以执行以下操作:

SELECT DATE_SUB(CURDATE(), INTERVAL i.intvalue DAY) AS thedate, 
       COUNT(DISTINCT LoginAudit.LoginAuditID) AS logins
FROM i LEFT JOIN dual ON (DATE_SUB(NOW(), INTERVAL i.intvalue DAY)= day)
GROUP BY DATE_SUB(CURDATE(), INTERVAL i.intvalue DAY)
ORDER BY i DESC;
ETA,对于mysql:

//创建一个整数表

create table i(i integer not null primary key);
insert into i values (0),(1),(2) ... (9);
如果我需要0-99个连续数字:

SELECT 10*t.i + u.i AS number
  FROM i AS u
CROSS JOIN 
  i AS t
ORDER BY number;
如果我需要连续日期:

SELECT date_sub(curdate(), interval (10*t.i + u.i) DAY) as thedate 
  FROM i AS u
CROSS JOIN 
  i AS t
ORDER BY thedate;

不幸的是,使用MS SQL Server 2005。谢谢你@琼:是的。但尝试是最容易找到答案的方法。我尝试了,但无法让它工作。。。Mysql似乎在术语双重上失败了。选择日期,INTERVAL ints.id DAY作为日期,COUNTDISTINCT winners.id作为winners FROM ints LEFT JOIN dual ON DATE,INTERVAL ints.id DAY=按日期分组,INTERVAL ints.id DAY ORDER BY ints DESC@乔:很抱歉。这篇文章很旧,我几乎总是使用MySQL。你知道我如何让它在我上面发布的查询中工作吗?否则我会把它变成一个新问题:@joon:在我的答案中添加了一些MySQL让你开始。