2012-05-31 49 views
2

我有2代表与表结构 -报告列出新的和日常的老用户访问,每月或每年

用户用户名 INT,名称 VARCHAR(50),dateCreated会日期时间)和

用户登陆标识 INT,用户ID INT,DateLogge DIN日期时间)

我需要产生谁是登录到应用程序的所有日/月/年以下格式的用户的报告 -

日期,newusers使用,OldUsers,TotalUsers

日期 - 如果在应用程序中的第一次用户登录,他将被作为新的OT治疗 - 选择报告

NEWUSER日期herwise作为旧用户。

OldUser - 第一次访问后的后续用户登录。

例如,如果用户A在15号登录了一个月,他将在15日被视为新用户,但作为旧用户在网站上进行后续访问,并且需要在报告中作为旧用户进行报告。同样,如果用户B在2012年4月30日登录了一次,那么他将被视为旧用户。

你们可以请给我一个查询来输出报告吗?

我的数据如下 -

USER表

 
| UserID |   Name | DateCreated | 
|--------|--------------|-------------| 
|  1 |  Rajveer | 2012-01-01 | 
|  2 | Manoj Tyagi | 2011-08-10 | 
|  3 | Raghu Pandey | 2009-05-13 | 
|  4 | Bhajan Lal | 2012-05-01 | 
|  5 | Satbir Singh | 2011-08-03 | 

USERLOGIN表

 
| ID | UserID | DateLoggedIn | 
|----|--------|--------------| 
| 1 |  1 | 2012-04-27 | 
| 2 |  1 | 2012-05-25 | 
| 3 |  1 | 2012-05-28 | 
| 4 |  2 | 2012-03-21 | 
| 5 |  2 | 2012-05-30 | 
| 6 |  3 | 2012-05-20 | 
| 7 |  4 | 2012-05-29 | 
| 8 |  5 | 2012-04-22 | 
| 9 |  3 | 2012-05-15 | 

我需要整个数据一个月(所以不同的不需要)...基于我提供的数据,我应该得到以下内容

 
| Month | NewUsers | OldUsers | TotalUsers | 
|-------|----------|----------|------------| 
|  3 |  1 |  0 |   1 | 
|  4 |  2 |  0 |   2 | 
|  5 |  2 |  4 |   6 | 

由于用户标识3在5月登录两次,他的第一次访问应该被视为新的,第二次访问应该被视为旧的。

TIA,

Paritosh Arya。

+0

你想拥有用户列表还是只计算它们(就像在@eggyal答案中一样)?如果你想要列表,在一个选择中选择OldUsers Newusers和TotalUser会很奇怪。这是可能的,但它会导致排名靠后的名单,我认为最好做3次选择。 – Joe

+0

在您的示例数据中,每次访问都发生在相应用户的'DateCreated'之后(在大多数情况下,显着如此),因此每次访问时每个用户都是“旧”不?你为什么在你的示例输出中将用户显示为“新”? – eggyal

+0

用户首次登录时,我需要在报告中显示新用户登录到该网站。之后,用户(之前已经登录)成为旧用户,并且不再是唯一的,因此需要列为旧用户。这只是我正在努力以这种方式呈现数据的报告的逻辑......因此,在获得注册后,如果用户第一次登录,报告应该说一个新用户登录。任何后续访问会认为他是老用户 – user869375

回答

0

你可以执行一个外部的登录表,并在加入日期,然后算上不同的用户ID的每个表中的用户表之间的连接:

SELECT DATE(l.DateLoggedIn)        AS Date, 
     COUNT(DISTINCT u.UserID)       AS NewUsers, 
     COUNT(DISTINCT l.UserId) - COUNT(DISTINCT u.UserID) AS OldUsers, 
     COUNT(DISTINCT l.UserId)       AS TotalUsers 
FROM  UserLogin           AS l 
    LEFT JOIN Users           AS u 
     ON l.UserId = u.UserID 
     AND DATE(l.DateLoggedIn) = DATE(u.DateCreated) 
GROUP BY Date 
+0

@ user869375:我假设你只想统计一次用户,即使他们在某一天登录过多次;如果情况并非如此,您只需计算登录次数,那么从每个COUNT()函数中删除“DISTINCT”关键字。 – eggyal

+0

这工程伟大eggyal!感谢您的帮助 – user869375

+0

我必须得到整个计数.....所以删除独特的工作对我来说。 – user869375

0

我认为,这显示了逻辑,但可能没有性能最高。

;With NewUser as (
     Select ul.UserID 
      , Min(ul.DateLoggedIn) as NewDate 
     from dbo.USERLOGIN as ul 
     group by UserID) 

    Select 
     Month(l.DateLoggedIn) as ThisMonth 
     , (Select Count(*) from dbo.USERLOGIN as ul 
     inner join NewUser as nu 
     on ul.UserID = nu.UserID 
       and ul.DateLoggedIn = nu.NewDate 
     where Month(ul.DateLoggedIn) = Month(l.DateLoggedIn) 
     ) as NewUsers 
     , (Select Count(*) from dbo.USERLOGIN as ul 
     where Month(ul.DateLoggedIn) = Month(l.DateLoggedIn) 
      AND not exists (Select * from NewUser as nu 
      where ul.UserID = nu.UserID 
          and ul.DateLoggedIn = nu.NewDate) 
     ) as OldUsers 
     , Count(*) as TotalUsers 
    from dbo.USERLOGIN as l 
    group by Month(l.DateLoggedIn) 

-- a little testing code 
CREATE TABLE [dbo].[USERLOGIN](
     [ID] [int] NOT NULL, 
     [USERID] [int] NOT NULL, 
     [DateLoggedIn] [date] NOT NULL 
    ) 
    ; 
    insert INTO dbo.USERLOGIN 

    select 1, 1, '2012-04-27' 
    union all 
    Select 2, 1, '2012-05-25' 
    union all 
    Select 3 , 1,'2012-05-28' 
    union all 
    Select 4 , 2,'2012-03-21' 
    union all 
    Select 5 , 2,'2012-05-30' 
    union all 
    Select 6 , 3 ,'2012-05-20' 
    union all 
    Select 7 , 4 ,'2012-05-29' 
    union all 
    Select 8 , 5,'2012-04-22' 
    union all 
    Select 9 , 3,'2012-05-15'