2013-02-22 56 views
0

數列中的事件我有一個表,如下所示:SQL - 白天

,我想算的出現說「AB」,並在列PAGEURL和GROUP BY DAY「CD」(即無關於當天發生多少次事件,它計爲1)。

ID User Activity PageURL ActDateTime 
1 Me act1  abcd  2013-01-17 19:09:01.040 
2 Me act2  cdab  2013-01-17 19:09:06.613 
3 You act2  xyza  2013-01-30 16:10:50.177 
4 Me act3  xyab  2013-01-30 10:35:09.037 

我想有兩列... 1「AB」的計數和1「CD」的計數。

在上面的例子中,「ab」有3個計數,但我只會計爲2,因爲前兩個發生在同一天(因此計爲1)。

同樣,在PageURL列中「cd」有2個計數,但我只想計爲1,因爲它也發生在同一天。此外,我想按月份分組,即1月12日,2月12日,3月12日,4月12日...等。

真的很感謝一些幫助和建議。謝謝!

這是我到目前爲止已經完成(但它沒有考慮到白天賬戶分組)

SELECT USER, 
     department, 
     activity, 
     [MonthYear] = DATENAME(mm, ActDateTime)+ ' - ' + 
            DATENAME(yy, actdatetime), 
     [ab] = sum(case when pageURL like '%ab%' THEN 1 else 0 END), 
     [cd]= sum(CASE WHEN pageURL LIKE '%cd%'THEN 1 ELSE 0 END) 
FROM activityLog 
GROUP BY USER, 
     department, 
     activity, 
     DATENAME(mm, ActDateTime)+ ' - ' + 
     DATENAME(yy, ActDateTime) 
ORDER BY USER, 
     department, 
     activity, 
     DATENAME(mm, ActDateTime)+ ' - ' + DATENAME(yy, ActDateTime) 

回答

0
SELECT Thing 
     ,COUNT(*) NumDays 
FROM (SELECT LEFT(PageURL, 2) AS Thing 
     ,DateTime 
     FROM table 
     ALL 
     SELECT RIGHT(PageURL, 2) 
      ,DateTime 
     FROM table) UniqueDays 

這不會因爲你的關鍵詞的工作是爲在你的問題中使用。

通常,使用實際的列/表名稱更容易,所以答案可以反映這些 - 它可以避免混淆。

+0

謝謝,我會更新的列名! – 2013-02-22 05:20:27

2

這應該工作,以創建計數我想:

SELECT 
    cast(ActDateTime as Date) as DateOnly, 
    SUM(CASE WHEN PageUrl Like '%ab%' THEN 1 ELSE 0 END) as ABCount, 
    SUM(CASE WHEN PageUrl Like '%cd%' THEN 1 ELSE 0 END) as CDCount 
FROM Table1 
GROUP BY cast(ActDateTime as Date) 

SQL Fiddle

+0

不確定邏輯,但對於特定的實現,有一個小問題。 「COUNT」計數「0」和「1」一樣。意思是,你應該用'NULL'替換'0'(或者簡單地刪除'ELSE'子句)或用'SUM'替換兩個'COUNT'。即我可能不確定條件或分組標準是否正確,但我可以看到您正在嘗試進行條件聚合,而這正是問題所在。對於COUNT,您應該規定NULL來省略計數,但是如果您希望使用1和0來完成此操作,請使用SUM。 – 2013-02-22 14:21:58

+0

@AndriyM謝謝你,你絕對是對的,我沒有進行實際的測試,因此這次也包括了sql小提琴。 – 2013-02-22 14:40:33

0

首先查詢一天獲得數:

SELECT cast(ActDateTime AS Date) AS DateOnly, 
     CASE 
      WHEN SUM(CASE WHEN PageUrl LIKE '%ab%' THEN 1 ELSE 0 END) >=1 THEN 1 
      ELSE 0 
     END AS ABCount, 
     CASE 
      WHEN SUM(CASE WHEN PageUrl LIKE '%cd%' THEN 1 ELSE 0 END) >=1 THEN 1 
      ELSE 0 
     END AS CDCount 
FROM activityLog 
GROUP BY cast(ActDateTime AS Date) 

第二次查詢得到你想要的輸出:

SQLFIDDLEExample

SELECT DATENAME(month, a.ActDateTime)+ ' - ' + DATENAME(yy, a.ActDateTime) 
     ,SUM(a.ABCount) as ABCount 
     ,SUM(a.CDCount) as CDCount 
FROM (SELECT cast(ActDateTime AS Date) AS ActDateTime, 
     CASE 
      WHEN SUM(CASE WHEN PageUrl LIKE '%ab%' THEN 1 ELSE 0 END) >=1 THEN 1 
      ELSE 0 
     END AS ABCount, 
     CASE 
      WHEN SUM(CASE WHEN PageUrl LIKE '%cd%' THEN 1 ELSE 0 END) >=1 THEN 1 
      ELSE 0 
     END AS CDCount 
FROM activityLog 
GROUP BY cast(ActDateTime AS Date))a 
GROUP BY DATENAME(month, a.ActDateTime)+ ' - ' + DATENAME(yy, a.actdatetime) 
ORDER BY DATENAME(month, a.ActDateTime)+ ' - ' + DATENAME(yy, a.actdatetime) 

結果:

|  COLUMN_0 | ABCOUNT | CDCOUNT | 
-------------------------------------- 
| January - 2013 |  2 |  1 |