2014-01-29 67 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