1

運とガムテープで、従業員データを処理するためのデータベースを構築しました。月に一度、次のフィールドを含む大量の Excel スプレッドシートを受け取ります。

従業員番号、会計月、プロジェクトコード、労働時間

従業員番号や従業員の名前などをリンクするクエリ/テーブルを作成しました。すべては順調です。

私が抱えている問題は、おそらく、1 日のクラスがいくつかあることを除いて、プログラミングのバックグラウンドがないためです。勤務時間がないときに結果を返したいということです。

具体的な例として、Project Pasta というプロジェクトがあるとします。3 月には、Project Pasta で何時間も働いた人はいませんでした。ただし、各プロジェクトで作業したすべての時間のレポートを実行すると、結果のスプレッドシートの 2 列目に Project Past が引き続き「0」と表示されるようにします。

私はさまざまな形式の Left Outer Join を試しましたが、「Null」を返す方法がわかりません。この時点で、Access と自分自身に非常に腹を立てており、助けを求めて泣きたいと思いました。

誰の質問にも答えますが、助けるために何を知る必要があるかは 100% わかりません。Windows XP 上の Microsoft Access 2007 です。

ありがとうございました!:)

私が今持っているクエリは、マネージャーごとにグループ化しています:

SELECT timeworked.fiscalmonth, 
       timeworked.projectcode, 
       kronoscodes.projectname, 
       SUM(timeworked.hoursworked) AS SumOfHoursWorked, 
       employees.manager 
FROM   employees 
       INNER JOIN ((kronoscodes 
                    INNER JOIN timeworked 
                            ON kronoscodes.projectcode = timeworked.projectcode) 
                   INNER JOIN months 
                           ON timeworked.fiscalmonth = months.fiscalmonth) 
               ON employees.[employee id] = timeworked.employeeid 
GROUP  BY timeworked.fiscalmonth, 
          timeworked.projectcode, 
          kronoscodes.projectname, 
          employees.manager 
HAVING (( ( timeworked.fiscalmonth ) LIKE "janfy13" )); 

列名は次のとおりです。

EmployeeID, 
ProjectCode, 
ProjectName, 
HoursWorked, 
FiscalMonth

したがって、基本的には、インポートしたデータの「作業時間」の下に何もなかったとしても、すべてのプロジェクトコードが会計月ごとに戻ってくることを望んでいます。

4

1 に答える 1

1

次のサンプル データを検討してください。

Table: timeworked
employeeid  fiscalmonth projectcode hoursworked
1           janfy13     101         16
2           janfy13     101         11
1           janfy13     102         8

Table: employees
[employee id]   manager
1               Manager A
2               Manager B

Table: kronoscodes
projectcode projectname
101         Project 101
102         Project 102
103         Project 103

まっすぐな INNER JOINS を使用すると、"Report by Manager" の少し簡略化されたバージョンは次のようになります。

インナー

SQL の場所

SELECT employees.manager, timeworked.fiscalmonth, kronoscodes.projectname, 
    Sum(timeworked.hoursworked) AS SumOfHoursWorked
FROM employees INNER JOIN 
    (kronoscodes INNER JOIN timeworked 
        ON kronoscodes.projectcode = timeworked.projectcode
    ) ON employees.[employee id] = timeworked.employeeid
GROUP BY employees.manager, timeworked.fiscalmonth, kronoscodes.projectname;

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

manager     fiscalmonth projectname SumOfHoursWorked
Manager A   janfy13     Project 101 16
Manager A   janfy13     Project 102 8
Manager B   janfy13     Project 101 11

うーん、「マネージャーB」の「プロジェクト102」の言及はなく、「プロジェクト103」の言及はまったくありません。それでも、かなり良いスタートなので、「ProjectSumsByManager_innerJoin」として保存しましょう。(後で役立つかもしれません...ヒント、ヒント。)

すべてのプロジェクトを表示したいので、[timeworked] と [kronoscodes] の間の結合を右クリックし、[結合プロパティ] を選択して、オプション ['kronoscodes' のすべてのレコードと 'timeworked' のレコードのみを含める] を選択します。結合されたフィールドが等しい場合。」

参加する

残念ながら、クエリを実行しようとすると、厄介な「あいまいな外部結合」メッセージが表示されます。

あいまいな外部結合が含まれているため、SQL ステートメントを実行できませんでした。結合の 1 つを最初に強制的に実行するには、最初の結合を実行する別のクエリを作成し、そのクエリを SQL ステートメントに含めます。

では、その結合のみを使用して別のクエリを作成します。

アウター1

SQL の場所

SELECT kronoscodes.projectcode, timeworked.employeeid, 
    timeworked.fiscalmonth, timeworked.hoursworked
FROM kronoscodes LEFT JOIN timeworked 
    ON kronoscodes.projectcode = timeworked.projectcode;

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

projectcode employeeid  fiscalmonth hoursworked
101         1           janfy13     16
101         2           janfy13     11
102         1           janfy13     8
103

「Project 103」はありますが、employeeid がないため、[employees] レコードにリンクしてマネージャーを取得する方法はありません。さらに、「プロジェクト 102」は依然として「従業員 1」(「マネージャー A」) にのみ関連付けられているため、「マネージャー B」は表示されません。このアプローチは特に有望ではないようです。

おそらく、私たちが本当に必要としているのは、すべてのプロジェクトとすべてのマネージャーのリストだけです:

SELECT DISTINCT kronoscodes.projectname, employees.manager
FROM kronoscodes, employees;

戻る

projectcode         manager
Project 101         Manager A
Project 101         Manager B
Project 102         Manager A
Project 102         Manager B
Project 103         Manager A
Project 103         Manager B

Access で新しいクエリを作成する場合は、その SQL ステートメントを SQL ビューに入力 (または貼り付け) し、それを「Project_Manager_map」として保存します。これを上記の最初のクエリとLEFT JOINして取得します。

アウター2

SQL の場所

SELECT Project_Manager_map.manager, ProjectSumsByManager_innerJoin.fiscalmonth, 
    Project_Manager_map.projectname, ProjectSumsByManager_innerJoin.SumOfHoursWorked
FROM Project_Manager_map LEFT JOIN ProjectSumsByManager_innerJoin ON 
    (Project_Manager_map.manager = ProjectSumsByManager_innerJoin.manager) 
        AND (Project_Manager_map.projectname = ProjectSumsByManager_innerJoin.projectname);

結果は

manager     fiscalmonth projectname SumOfHoursWorked
Manager A   janfy13     Project 101 16
Manager B   janfy13     Project 101 11
Manager A   janfy13     Project 102 8
Manager B               Project 102 
Manager A               Project 103 
Manager B               Project 103 
于 2013-03-29T12:47:30.910 に答える