GridViewsおよびGroupbyを使用したデータの管理

asp.net c# gridview sql sql-server
GridViewsおよびGroupbyを使用したデータの管理

ASP.NET(C#)GridViewとSql Serverバックエンドを備えたテンプレートフィールドを使用するタイムシートレポートアプリケーションに取り組んでいます。 基本的に、その週の従業員のタスクリストを取得し、RowDataBoundを使用してGridViewを循環し、EndTimeがSun-Satに該当するかどうかを確認してから、その列ラベルにそれらの時間/分を配置します。 GridViewヘッダーの例を以下に示します(フォーマットについてはごめんなさい)。

タイプ|時間|分|開始時間|終了時間|日|月|火|水|木|金|土|合計

問題は、StartTime / EndTimesが一意であるため、groupbyがタスクをグループ化していないことですが、それらを戻す必要があるので、該当する日を確認し、その列にデータを追加します(2行を確認できます)以下に戻ります)。 2番目のGridViewを作成し、1番目の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 [email protected])
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

  0  0


ベストアンサー

必要なのは、週ごとにグループ化することです。 http://www.sqlhacks.com/Dates/Group-By-Week [こちら]でヘッドスタートを探して、完全なソリューションのサポートが必要かどうかをお知らせください。

0


私はあなたの要件が何であるかを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

その後、2つのクエリを結合して全体像を取得しました

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

覚えておいてください、私は議事録の部分をほとんど無視しましたが、少なくともこれがあなたにとって役立つことを願っています。

0


タイトルとURLをコピーしました