2010-12-17 174 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