2009-09-25 159 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