1

各給与期間に各従業員が使用した時間を追跡する Access データベースがあります。

従業員ごとに過去 26 の支払期間から計算して、過去 25 の支払期間の合計を確認できるクエリが必要です。これは基本的に、26 支払期間 (またはそれ以上) 古いレコードを行ごとに無視する必要があるローリング合計です。私は 5 年分の記録を持っていますが、残念ながらそれらをすべて保持する必要があります。各従業員の 26 年間の支払期間の現在の合計が、1 時間で使用された時間と一緒に確認できることは非常に重要です。特定の支払い期間。

基本的に、各従業員の合計51レコードを見ています。ただし、クエリが実際に表示する最初の支払い期間は26支払い期間前です。その支払い期間に発生したものに、前の 25 を加えたものに基づいて現在の合計が表示されます。

テーブル:
HoursIDEmployeeIDPayPeriodIDHoursUsed
PayPeriodIDPayPeriodEndDate

クエリ結果 (既に動作中):
EmployeeIDTotalOfHoursUsedLast26PP (このクエリは、カウントバックする日付を要求します)

必要なクエリ結果:
EmployeeIDPayPeriodIDHoursUsed、[この PP の直前の 25 PP に基づく総使用時間]

私は DSum をいじっていますが、必要な PP を一度に 1 人の従業員に対して、各給与期間ごとに個別に数えて、最後の 26 PPのみをカウントする方法がわかりません。

明確にするために: 2009 年か何かの 26 の支払い期間について、このクエリを振り返って実行できるようにする必要があります。Excel では、1 人の従業員に対して、次のようなことを行いました。

Line32_HoursUsedLast26PP = Line32_HoursUsedThisPP + Line31_HoursUsedLast26PP - Line4_HoursUsedThisPP

結果は次のようになります。

2011-5 - 338.8
2011-6 - 398.5
2011-7 - 428.7
2011-8 - 442.5 2011-9
- 451
2011-10 - 451
2011-11 - 451
2011-12 - 451
2011-13 - 451 4 - 2011-11 2011-15 - 451 2011-16 - 452.4 2011-17 - 453.1 2011-18 - 454.3 2011-19 - 454.3 2011-20 - 455 2011-21 - 456.1 2011-22 - 460.2 2011-22 - 14 48 2011-25 - 480 2011-26 - 480 2012-01 - 453.2 2012-02 - 381.2 2012-03 - 301.2 2012-04 - 221.2 2012-05 - 141.2 2012-06 - 81.5



















2012-07 - 51.3
2012-08 - 37.5
2012-09 - 29
2012-10 - 29
2012-11 - 29
2012-12 - 29
2012-13 - 29
2012-14 - 29 2012-15 -
29
2012-16 - 27.6
2012-17 - 26.9
2012-18 - 25.7
2012-19 - 25.7
2012-20 - 25
2012-21 - 23.9
2012-22 - 19.8
2012-23 - 0

ご覧のとおり、現在の合計は上下ます。

これは、「過去 26 の支払い期間の合計時間を検索する」クエリの実際のコードです。認定などに関する問題は、特定の給与期間において、従業員が複数の認定の下で記録された時間を持っている可能性があるためです。

SELECT List_Employees.ID, Sum(Items_Hours_Actually_Taken.HoursActual) AS SumOfHoursActual
FROM (List_Pay_Periods INNER JOIN (List_Employees INNER JOIN (Items_Certifications INNER JOIN Items_Hours_Actually_Taken ON Items_Certifications.[CertificationID] = Items_Hours_Actually_Taken.[HoursActualCertificationID]) ON List_Employees.ID = Items_Certifications.[CertificationEmployeeID]) ON List_Pay_Periods.[PayPeriodID] = Items_Hours_Actually_Taken.[HoursActualPayPeriod]) INNER JOIN Last_26_PP_From_Today ON List_Pay_Periods.PayPeriodID = Last_26_PP_From_Today.PayPeriodID
GROUP BY List_Employees.ID;

明確でない場合、このクエリは Last_26_PP_From_Today と呼ばれる別のクエリに依存します。

SELECT List_Pay_Periods.PayPeriodID, List_Pay_Periods.PPEnd
FROM List_Pay_Periods
WHERE (((List_Pay_Periods.PPEnd)<Date() And (List_Pay_Periods.PPEnd)>(Date()-14)));

また、特定の日付から過去 26 の支払い期間を検索するように切り替えるクエリもあります。

PARAMETERS [Date] DateTime;
SELECT List_Pay_Periods.PayPeriodID, List_Pay_Periods.PPEnd
FROM List_Pay_Periods
WHERE (((List_Pay_Periods.PPEnd)<[Date] And (List_Pay_Periods.PPEnd)>([Date]-14)));

私が絶望的に​​思いついた力ずくの方法は、一連の Make Table クエリのカスケードを伴うものでした。そのとき、誰かがもっとクリーンなものを提供してくれるかもしれないと判断したのです。

アップデート

Gord のおかげで、支払い期間の数字が表示されないことを除いて、すべてが機能するようになりました。

SELECT hbep1.Employee, hbep1.PP

(

SELECT Sum(hbep2.Hours) 
        FROM Hours_By_Employee_Per_PP AS hbep2
        WHERE hbep2.Employee=hbep1.Employee 
            AND (hbep2.PP Between hbep1.[PP]-25 And hbep1.[PP])

    ) AS SumLast26

FROM Hours_By_Employee_Per_PP AS hbep1;

それは私を得る:

Employee    SumLast26
2           12
2           12
2           12
2           18
2           91
3           4
3           8
3           88
3           168
3           180
5           15
5           15
5           15
7           43
7           61
7           75
7           97
7           106
7           121
9           19
9           0
4

1 に答える 1

0

これがあなたを正しい方向に向けてくれることを願っています:

[Hours_by_Empl_PP] という名前のテーブルから始めました。このテーブルには、個々の Pay_Period における各従業員の合計時間が含まれています。

EmployeeID  PayPeriodID HoursUsed
1           1           3
1           2           7
1           3           4
1           4           4
1           5           5
1           6           8
1           7           5
2           1           1
2           2           2
2           3           1
2           4           0
2           5           0
2           6           1
2           7           2

テーブル データに特定の (Employee + Pay_Period) の複数のレコードがある場合、単純な集計クエリを作成して値を合計できます...

SELECT EmployeeID, PayPeriodID, SUM(HoursUsedToday) AS HoursUsed
FROM YourRawData
GROUP BY EmployeeID, PayPeriodID

... [Hours_by_Empl_PP] として保存し、テーブルの代わりに使用します。

次のステップは、4 期間のウィンドウの時間数を合計するクエリを作成することでした。(作業を簡単に確認できるように、26 ではなく 4 を選択しました。) このウィンドウには、現在の Pay_Period と前の 3 つが含まれています。

SELECT hbep1.EmployeeID, hbep1.PayPeriodID, 
    (
        SELECT Sum(hbep2.HoursUsed) 
        FROM Hours_by_Empl_PP hbep2
        WHERE hbep2.EmployeeID=hbep1.EmployeeID 
            AND (hbep2.PayPeriodID Between hbep1.[PayPeriodID]-3 And hbep1.[PayPeriodID])
    ) AS Sum_of_Hours_last_4_PPs
FROM Hours_by_Empl_PP hbep1;

このクエリは私に

EmployeeID  PayPeriodID Sum_of_Hours_last_4_PPs
1           1           3
1           2           10
1           3           14
1           4           18
1           5           20
1           6           21
1           7           22
2           1           1
2           2           3
2           3           4
2           4           4
2           5           3
2           6           2
2           7           3

このクエリでは、PayPeriodID の値が時系列で連続していると想定していることに注意してください。[PayPeriodEndDate] 値を使用して同じ結果を得ることができますが、それは別の JOIN を意味するため、例をできるだけ明確にしたかったのです。

それだけです、本当に。そのクエリを [Hours_by_Empl_4PP_window] のような名前で保存し、それをクエリで使用して他のテーブル (従業員名など) に結合し、そこから取得することができます。

于 2013-03-22T13:26:31.993 に答える