【问题标题】:Managing data using GridViews and Groupby使用 GridViews 和 Groupby 管理数据
【发布时间】:2011-08-29 22:53:54
【问题描述】:

我正在使用带有 Sql Server 后端的 ASP.NET (C#) GridView 和模板字段开发时间表报告应用程序。我基本上是在抓取员工本周的任务列表,使用 RowDataBound 循环浏览 GridView 并检查 EndTime 是否落在 Sun - Sat,然后将这些小时/分钟放在该列标签中。您可以在下面看到我的 GridView 标头示例(对格式感到抱歉)。

Type|Hours|Minutes|StartTime|EndTime|Sun|Mon|Tue|Wed|Thu|Fri|Sat|Total 

问题是我的 groupby 没有将我的任务分组在一起,因为我的 StartTime/EndTimes 将是唯一的,但我需要将它们拉回来以便我可以检查它属于哪一天,然后填充该列(如您所见它在下面返回的两行)。我认为可能有一种方法可以创建第二个 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

【问题讨论】:

  • 您给我们的结果显示分组没有任何问题。你能详细说明一下吗?
  • 换句话说,我希望我的分组对两个安装任务进行分组,然后将小时和分钟相加。所以是的,SQL 结果是正确的,但我需要 Gridview 来执行分组和 SUM(),然后放在星期几列中。所以会有一列安装,周二列显示 1 小时,周三列显示 1 小时 30 分钟。

标签: sql asp.net .net sql-server gridview


【解决方案1】:

我不能 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'  ) 

我创建了一个取自 Kodyaz Development Services 的 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

接下来我创建了一个详细信息数据透视查询来计算一周中每一天花费的小时数。

 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    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

请注意,我几乎忽略了分钟部分,但我希望至少这对您有所帮助。

【讨论】:

  • 这对我来说完美无缺。我最终解散了 Hours 并在几分钟内计算了所有内容,然后让 .NET 处理 toHours 转换。谢谢,如果可以的话,我会投票赞成。
【解决方案2】:

您需要按周分组。查看 here 以获取先机,如果您需要有关完整解决方案的帮助,请告诉我们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2016-02-15
    相关资源
    最近更新 更多