2

他の 2 つの列に基づいて列を計算しようとしていますが、計算で複数の行を考慮する必要がある特殊なケースがいくつかあります。

現在のクエリは次のとおりです。

SELECT
    UserName
    , EntryDate
    , Project
    , HoursWorked
    , HoursAvailable
    , UtilPct as HoursWorked / HoursAvailable
FROM
    MyDatabase
ORDER BY
    EntryDate

結果は次のとおりです。

UserName EntryDate Project HoursWorked HoursAvailable UtilPct
Justin 12/17/2012 ABC 8 8 100
Justin 12/18/2012 ABC 4 8 50
Justin 12/18/2012 DEF 4 8 50

しかし、最後の 2 つのエントリの 50% の使用率は正しくありません。どちらも同じ日に発生したからです。これらの行は両方とも 100% と表示されます。

クエリが必要です...

  1. 特定の日のすべての勤務時間の合計
  2. それをその日の最大利用可能時間で割ります
  3. その値を各行の UtilPct 列に入れます

どうすればそれを行うことができますか?

4

4 に答える 4

2

クエリが必要です...

特定の日のすべての HoursWorked を合計します その日の最大 HoursAvailable で割ります その値を各行の UtilPct 列に入れます

どうすればそれを行うことができますか?

HoursWorked をすべて合計します。

SUM(HoursWorked) ... GROUP BY EntryDate

それをその日の最大利用可能時間で割ります

SUM(HoursWorked)/MAX(HoursAvailable) ... GROUP BY EntryDate

その値を各行の UtilPct 列に入れます。

SELECT ... SUM(HoursWorked)/MAX(HoursAvailable)*100.0 AS UtilPct
    FROM MyDatabase
    GROUP BY EntryDate
    ORDER BY EntryDate

しかし、行を で割ることができなくなりProject、1 日の時間使用率のみが表示されます。しようとするとGROUP BY Project、再び 100% ではなく 50% になります。

これは、4/8 が 100% であることを求めているためであり、「火曜日に、私はプロジェクト ABC で 100% 作業し、プロジェクト DEF で 100% 作業しました」など、意味的に無意味な回答が得られるためです。 「では、火曜日は 200% ということですか?」

JOINテーブルとそれ自体の間で を使用して を使用して問題を解決TotalHoursWorked し、1 日で を取得できます。これは、1 つのプロジェクトの稼働時間とは意味的に異なります。

SELECT
    UserName
    , md1.EntryDate
    , Project
    , HoursWorked
    , HoursAvailable
    , (TotalHoursWorked / HoursAvailable)*100.0 AS UtilPct
FROM
    MyDatabase AS md1
    JOIN ( 
        SELECT EntryDate, SUM(HoursWorked) AS TotalHoursWorked
        FROM MyDatabase GROUP BY EntryDate
    ) AS md2 ON (md1.EntryDate = md2.EntryDate)
ORDER BY
    md1.EntryDate

これで、UtilPct はその日の時間使用量を参照します。つまり、プロジェクトで 5 分間しか作業しなかったとしても、その 5 分間がその日に利用できるすべてである場合、そのプロジェクトで 100% の値を得ることができます。また、そののそのプロジェクトHoursWorkedのオーバー率を示す別の列を追加することもできます(ほとんどのシステムでは、そのプロジェクトの優先度にほぼ比例するはずです)。HoursAvailable

于 2012-12-17T22:22:05.747 に答える
1
SELECT
    a.Username, 
    a.EntryDate,
    a.Project,
    a.HoursWorked,
    (b.TotalHoursWorked / a.HoursAvailable) * 100 as 'UtilPct'
FROM
    MyDatabase a
INNER JOIN
    (SELECT 
       SUM(HoursWorked) as TotalHoursWorked, 
       Username, 
       EntryDate 
     FROM 
       MyDatabase 
     GROUP BY 
       Username, EntryDate) b
ON
  a.Username = b.Username
  AND a.EntryDate = b.EntryDate
于 2012-12-17T22:21:24.500 に答える
0

クエリ:

SQLFIDDLEExample

SELECT
      t.UserName
    , t.EntryDate
    , t.Project
    , t.HoursWorked
    , t.HoursAvailable
    , (SELECT SUM(HoursWorked) 
      FROM MyDatabase 
      WHERE MyDatabase.EntryDate =t.EntryDate)/
      (SELECT MAX(HoursAvailable) 
      FROM MyDatabase 
      WHERE MyDatabase.EntryDate =t.EntryDate) AS UtilPct
FROM
    MyDatabase t
ORDER BY
    t.EntryDate

結果:

| USERNAME |                       ENTRYDATE | PROJECT | HOURSWORKED | HOURSAVAILABLE | UTILPCT |
-------------------------------------------------------------------------------------------------
|   Justin | December, 17 2012 00:00:00+0000 |     ABC |           8 |              8 |       1 |
|   Justin | December, 18 2012 00:00:00+0000 |     ABC |           4 |              8 |       1 |
|   Justin | December, 18 2012 00:00:00+0000 |     DEF |           4 |              8 |       1 |

ちなみにテーブルのいい名前。

于 2012-12-17T22:16:01.790 に答える
0

サブクエリは 1 日を合計するだけです。

        SELECT
              t.UserName
            , t.EntryDate
            , t.Project
            , t.HoursWorked
            , t.HoursAvailable
            , CASE WHEN HoursAvailable = 0 THEN 0 
                   ELSE Round(HoursWorked / HoursAvailable * 100.0, 2) 
                   END AS UtilPct
        FROM
            MyTable t
            INNER JOIN 
              (SELECT EntryDate,
                      UserName,          
                      SUM(HoursWorked) AS HoursWorked,
                      MAX(HoursAvailable) AS HoursAvailable
              FROM MyTable
              GROUP BY EntryDate,
                       UserName) AS Daily
        ON t.EntryDate = Daily.EntryDate
           AND t.UserName = Daily.UserName
        ORDER BY
            t.EntryDate,
            t.UserName
于 2012-12-17T22:27:31.933 に答える