2014-01-29 136 views
0

我想要获取报告,您可以在其中选择日期范围并获取一些信息。 我的表是这样sql日期范围在列中,并按组计算

-------------------------------------- 
RecID|AgentID|date 
-------------------------------------- 
1 |0| 05/09/2012 16:28:49 
2 |0| 05/09/2012 17:28:49 
3 |00124 | 05/09/2012 18:28:49 
4 |00124 | 06/09/2012 19:28:49 
5 |00125 | 06/09/2012 20:28:49 

我想是这样

-------------------------------------- 
AgentID|05/09/2012|06/09/2012 
-------------------------------------- 
0| 2  | 0 
00124 | 1  | 1 
00125 | 0  | 1 

我的代码是

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX), 
    @INIDate as date, 
    @ENDDate as date, 
    @INIDateVAR nvarchar(50), 
    @ENDDateVAR nvarchar(50) 

Set @INIDate = '10-01-2014' 
Set @ENDDate = '10-10-2014' 


DECLARE @sql NVARCHAR(MAX) = N'SELECT agentID'; 

;WITH dr AS 
(

    SELECT MinDate = @INIDate, 
     MaxDate = @ENDDate 
), 
n AS 
(
    SELECT TOP (DATEDIFF(DAY, (SELECT MinDate FROM dr), (SELECT MaxDate FROM dr)) + 1) 
    d = DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY [object_id])-1, 
    (SELECT MinDate FROM dr)) 
FROM sys.all_objects 
) 
SELECT @sql += ', 
    (Select Count(*) From AllRecordsView) as ' + QUOTENAME(d) 
    FROM n; 

SELECT @sql += ' FROM dbo.AllRecordsView Group by AgentID;' 

EXEC sp_executesql @sql; 
GO 

但是,当我选择一个大的日期范围,这会非常缓慢我得到的结果当然是完整表格的数量。

任何想法? 谢谢

回答

0

我最终做的是使用Reporting Services。这样我可以将列中的所有值作为列分配,每行一个。

0

您可以使用day()函数(取决于数据库)从日期字段中提取日期并在GROUP BY中使用它。 对于范围使用SQL BETWEEN。

如果仍然存在性能问题,应该在AgentID和日期列上创建一个索引。

SELECT dateColumn, AgentID, count(AgentID) AS agentCount
FROM YourTable
WHERE dateColumn BETWEEN '2012-09-05' AND '2012-09-09'
GROUP BY day(dateColumn), AgentID
ORDER BY dateColumn;

+0

嗨,谢谢你的回答。 是的,这会给我按日期和代理分组的计数,但不是以我期望的格式。 我想将日期列为列。所以选择日期和范围内的每个日期作为列。 – gianfrancopintus