Sql 使用GridView和Groupby管理数据
我正在使用ASP.NET C GridView和带有Sql Server后端的模板字段开发时间表报告应用程序。我基本上是抓取员工一周的任务列表,使用RowDataBond在GridView中循环,检查EndTime是否在Sun-Sat上,然后将这些小时/分钟放在该列标签中。您可以在下面看到我的GridView标题的一个示例,对于格式设置感到抱歉Sql 使用GridView和Groupby管理数据,sql,asp.net,.net,sql-server,gridview,Sql,Asp.net,.net,Sql Server,Gridview,我正在使用ASP.NET C GridView和带有Sql Server后端的模板字段开发时间表报告应用程序。我基本上是抓取员工一周的任务列表,使用RowDataBond在GridView中循环,检查EndTime是否在Sun-Sat上,然后将这些小时/分钟放在该列标签中。您可以在下面看到我的GridView标题的一个示例,对于格式设置感到抱歉 Type|Hours|Minutes|StartTime|EndTime|Sun|Mon|Tue|Wed|Thu|Fri|Sat|Total 问题是
Type|Hours|Minutes|StartTime|EndTime|Sun|Mon|Tue|Wed|Thu|Fri|Sat|Total
问题是我的groupby没有将我的任务分组在一起,因为我的开始时间/结束时间将是唯一的,但我需要将这些时间向后拉,以便检查它属于哪一天,然后填充该列,因为您可以看到它在下面返回的两行。我认为可能有一种方法可以创建第二个GridView,并根据第一个GridView中的某些值填充它。还有其他人遇到过这样的问题吗
SELECT
C.Task,
CONVERT(VARCHAR(10), A.StartTime, 101) As StartTime,
CONVERT(VARCHAR(10), A.EndTime, 101) As EndTime,
SUM(DATEDIFF(n, A.StartTime, A.EndTime)) / 60 AS Hours,
SUM(DATEDIFF(n, A.StartTime, A.EndTime)) % 60 AS Minutes
FROM dbo.Timesheet A, dbo.Employees B,
dbo.TimeSheet_Master C
WHERE A.CreatedBy = B.ContactId
AND A.Task = C.Task
AND (B.ContactId =@ContactId)
AND (A.StartTime >= @StartTime)
AND (A.EndTime <= @EndTime)
GROUP BY CONVERT(VARCHAR(10), A.StartTime, 101), CONVERT(VARCHAR(10), A.EndTime, 101), C.Task;
Task StartTime EndTime Hours Minutes
-------------------------------------------------------
Install 05/17/2011 05/17/2011 1 0
Install 05/18/2011 05/18/2011 1 30
你需要的是每周分组。寻找一个headstart,如果您需要完整解决方案的帮助,请告诉我们。我不能100%确定您的要求是什么,但这几乎就像您想要组合一个透视表一样 我做得很快,所以它可能不完全适合你的需要,但无论如何 我创建了一个名为timesheet的临时表,并添加了一些值:
CREATE TABLE #timesheet
(
Task VARCHAR(10),
employee INT,
StartDate DATETIME,
endDate DATETIME
)
INSERT INTO #timesheet (Task, employee, StartDate, endDate) VALUES ('Task1',10,'2011-5-10 17:00:00','2011-5-10 20:00:00' )
INSERT INTO #timesheet (Task, employee, StartDate, endDate) VALUES ('Task1', 10, '2011-5-12 17:00:00', '2011-5-12 20:00:00' )
INSERT INTO #timesheet (Task, employee, StartDate, endDate) VALUES ('Task2',10,'2011-5-12 17:00:00','2011-5-12 20:00:00' )
INSERT INTO #timesheet (Task, employee, StartDate, endDate) VALUES ('Task1', 12, '2011-5-08 17:00:00', '2011-5-08 20:00:00' )
我创建了一个GetWeekDayNameOfDate函数,从中获取一周中的某一天
我首先创建了一个摘要查询,如下所示:
SELECT #timesheet.Task,
#timesheet.employee,
MIN(#timesheet.StartDate) AS [Start Date],
MAX(#timesheet.endDate) AS [End Date],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate)) / 60 AS [Hours],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate)) % 60 AS [Minutes]
FROM #timesheet
GROUP BY #timesheet.Task,
#timesheet.employee
这将为我提供任务和员工的总结。它将显示整个持续时间的开始日期和结束日期以及小时和分钟数
我的结果是:
Task employee Start Date End Date Hours Minutes
---------- ----------- ----------------------- ----------------------- ----------- -----------
Task1 10 2011-05-10 17:00:00.000 2011-05-12 20:00:00.000 6 0
Task2 10 2011-05-12 17:00:00.000 2011-05-12 20:00:00.000 3 0
Task1 12 2011-05-08 17:00:00.000 2011-05-08 20:00:00.000 3 0
Task Employee Sunday Monday Tuesday Wendesday Thursday Friday Saturday
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
Task1 10 0 0 3 0 3 0 0
Task1 12 3 0 0 0 0 0 0
Task2 10 0 0 0 0 3 0 0
接下来,我创建了一个details pivot查询,以汇总一周中每天花费的小时数
SELECT Task,
Employee,
ISNULL([Sunday], 0) AS Sunday,
ISNULL([Monday], 0) AS Monday,
ISNULL([Tuesday], 0) AS Tuesday,
ISNULL([Wednesday], 0) AS Wendesday,
ISNULL([Thursday], 0) AS Thursday,
ISNULL([Friday], 0) AS Friday,
ISNULL([Saturday], 0) AS Saturday
FROM ( SELECT #timesheet.Task,
#timesheet.employee,
dbo.GetWeekDayNameOfDate(#timesheet.StartDate) AS [Day],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate))
/ 60 AS [Hours],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate))
% 60 AS [Minutes]
FROM #timesheet
GROUP BY #timesheet.Task,
#timesheet.employee,
dbo.GetWeekDayNameOfDate(#timesheet.StartDate)
) p PIVOT ( SUM(Hours) FOR [DAY] IN ( [Sunday], [Monday], [Tuesday],
[Wednesday], [Thursday],
[Friday], [Saturday] ) ) AS PivotTable
我的结果是:
Task employee Start Date End Date Hours Minutes
---------- ----------- ----------------------- ----------------------- ----------- -----------
Task1 10 2011-05-10 17:00:00.000 2011-05-12 20:00:00.000 6 0
Task2 10 2011-05-12 17:00:00.000 2011-05-12 20:00:00.000 3 0
Task1 12 2011-05-08 17:00:00.000 2011-05-08 20:00:00.000 3 0
Task Employee Sunday Monday Tuesday Wendesday Thursday Friday Saturday
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
Task1 10 0 0 3 0 3 0 0
Task1 12 3 0 0 0 0 0 0
Task2 10 0 0 0 0 3 0 0
之后,我把我的两个问题结合在一起,得到了整个情况
SELECT summary.Task,
summary.employee,
summary.[Start Date],
summary.[End Date],
details.Sunday,
details.Monday,
details.Tuesday,
details.Wendesday,
details.Thursday,
details.Friday,
details.Saturday,
summary.Hours,
summary.Minutes
FROM ( SELECT #timesheet.Task,
#timesheet.employee,
MIN(#timesheet.StartDate) AS [Start Date],
MAX(#timesheet.endDate) AS [End Date],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate))
/ 60 AS [Hours],
SUM(DATEDIFF(n, #timesheet.StartDate, #timesheet.endDate))
% 60 AS [Minutes]
FROM #timesheet
GROUP BY #timesheet.Task,
#timesheet.employee
) summary
INNER JOIN ( SELECT Task,
Employee,
ISNULL([Sunday], 0) AS Sunday,
ISNULL([Monday], 0) AS Monday,
ISNULL([Tuesday], 0) AS Tuesday,
ISNULL([Wednesday], 0) AS Wendesday,
ISNULL([Thursday], 0) AS Thursday,
ISNULL([Friday], 0) AS Friday,
ISNULL([Saturday], 0) AS Saturday
FROM ( SELECT #timesheet.Task,
#timesheet.employee,
dbo.GetWeekDayNameOfDate(#timesheet.StartDate) AS [Day],
SUM(DATEDIFF(n, #timesheet.StartDate,
#timesheet.endDate)) / 60 AS [Hours],
SUM(DATEDIFF(n, #timesheet.StartDate,
#timesheet.endDate)) % 60 AS [Minutes]
FROM #timesheet
GROUP BY #timesheet.Task,
#timesheet.employee,
dbo.GetWeekDayNameOfDate(#timesheet.StartDate)
) p PIVOT ( SUM(Hours) FOR [DAY] IN ( [Sunday], [Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday] ) ) AS PivotTable
) details ON summary.Task = details.Task
AND summary.Employee = details.Employee
通过这样做,我将得到以下结果:
Task employee Start Date End Date Sunday Monday Tuesday Wendesday Thursday Friday Saturday Hours Minutes
---------- ----------- ----------------------- ----------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
Task1 10 2011-05-10 17:00:00.000 2011-05-12 20:00:00.000 0 0 3 0 3 0 0 6 0
Task1 12 2011-05-08 17:00:00.000 2011-05-08 20:00:00.000 3 0 0 0 0 0 0 3 0
Task2 10 2011-05-12 17:00:00.000 2011-05-12 20:00:00.000 0 0 0 0 3 0 0 3 0
请注意,我几乎忽略了分钟部分,但我希望至少这对您有所帮助。您给我们的结果显示分组没有任何问题。您能详细说明一下吗?换句话说,我希望我的分组将两个安装任务分组,然后将小时和分钟相加。因此,是的,SQL结果是正确的,但是我需要Gridview来执行分组和求和,然后将其放在星期几列中。因此,将有一个安装专栏,显示周二专栏1小时,周三专栏1小时30分钟。这对我来说是完美的。我最终放弃了小时数,并在几分钟内计算了所有内容,然后让.NET处理toHours转换。谢谢,如果可以的话,我会投赞成票的。