2012-05-31 84 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'