2010-12-17 198 views
0

我真的不擅長SQL,我只想寫一個顯示圖表中某些日誌數據的查詢。Transact SQL查詢幫助

我有一個SQL Server表,其中我記錄了對Web服務的請求。

ID   RequestedFunction  RequestDateTime 
1   'Confirm()'    2010-12-15 13:27:01.234 
2   'Register()'   2010-12-16 12:27:00.678 
3   'Confirm()'    2010-12-16 21:00:05.456 

現在,我想編寫返回我每天通過RequestedFunction分組做出的請求數的查詢;返回給我一個這樣的數據集。

Day   ConfirmFunctionRequests  RegisterFunctionRequests 
15   1        0 
16   1        1 

這可能嗎?所有我能想出到目前爲止是這樣的,

;WITH CTE AS 
(
SELECT id, 
    [Day] = CAST(day(requestDateTime) AS INT), 
    RequestedFunction 
FROM [Log] 
WHERE month(RequestDateTime)=12 AND 
year(RequestDateTime)=2010 
) 
SELECT [Day],COUNT(ID) AS [#Requests] FROM CTE GROUP BY [Day] 

它返回每天的請求數,沒有不同類型的請求之間的區別。我如何編寫一個查詢,根據'RequestedFunction'中的值將請求計入兩個不同的列中?

回答

2

這可以使用PIVOT但一個快速和簡單的解決辦法是這樣的

DECLARE @Log TABLE(
     ID INT, 
     RequestedFunction VARCHAR(50), 
     RequestDateTime DATETIME 
) 
INSERT INTO @Log SELECT 1,'Confirm()','2010-12-15 13:27:01.234' 
INSERT INTO @Log SELECT 2,'Register()','2010-12-16 12:27:00.678' 
INSERT INTO @Log SELECT 3,'Confirm()','2010-12-16 21:00:05.456' 

SELECT DATEADD(dd,0, DATEDIFF(dd,0,RequestDateTime)) DayValue, 
     SUM(
       CASE 
        WHEN RequestedFunction = 'Confirm()' THEN 1 
        ELSE 0 
       END 
      ) ConfirmFunctionRequests, 
     SUM(
       CASE 
        WHEN RequestedFunction = 'Register()' THEN 1 
        ELSE 0 
       END 
      )RegisterFunctionRequests 
FROM @Log 
GROUP BY DATEADD(dd,0, DATEDIFF(dd,0,RequestDateTime)) 
+0

非常感謝你來完成!只是想知道,我是否也可以使用DATEPART(dd,RequestDateTime)作爲DATEADD(dd,0,DATEDIFF(dd,0,RequestDateTime))的替代方案? – 2010-12-17 12:36:26

+0

唯一的問題是,它只會按天分組,所以如果你有條目在1月15日和2月15日,它會將它們加在一起 – 2010-12-17 12:41:55

+0

是的,我想限制使用WHERE子句,也做小時,每個給定的一天等我嘗試使用DATEADD(hh,0,DATEDIFF(hh,0,RequestDateTime))幾個小時,但輸出似乎不太可讀。 – 2010-12-17 13:01:56