2009-09-25 158 views
2

我有一个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 
+0

我使用的是SQL Server 2005中 – Binz 2009-09-25 15:55:18

回答

4

基本上你要求的是将你的表加入日期的“表”。日期表不会有空白,您可以按日期值进行分组。那么如何创建一个日期表?

SQL for Smarties中,建议您为需要无间隙序列加入的情况保留一个整数表。然后你可以通过加入你的表格来选择你需要的任何顺序。

所以,如果您有相关值的整数表从去尽可能多的天回的要求,你可以做以下的NOW():

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; 
+0

这会在MySQL中工作吗? – joon 2012-05-05 14:32:17

+0

@joon:是的。但尝试它是找出问题的最简单方法。 – dnagirl 2012-05-07 13:42:07

+0

我做了,并且无法让它工作...... Mysql似乎在术语“DUAL”上失败。 (SELECT DATE_SUB(CURDATE(),INTERVAL ints.id DAY)asdate,COUNT(DISTINCT winners.id)AS winners FROM INTS LEFT JOIN dual ON(DATE_SUB(NOW(),INTERVAL ints.id DAY)= day)GROUP BY DATE_SUB(CURDATE(),INTERVAL ints.id DAY)ORDER BY INTS DESC;) – joon 2012-05-07 15:34:35

0

您正在使用哪些DBMS?

如果甲骨文,你可以尝试在一个子查询中选择您的日期,就像这样:

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 
+0

不幸的是使用MS SQL Server 2005中虽然感谢! – Binz 2009-09-25 15:57:46