MySqlの出席レポート

従業員の出席レポートを作成するためのクエリを作成したいと思います。まず、従業員の存在がデータベースにどのように保存されているかを教えてください。

私は以下の表を持っています。

Employee Table with Columns

    emp_id  emp_Name   Joining_Date
     1      john         11-01-2012
     2      Scott        12-01-2012


Holiday Table

Holiday_Name         Date 
Chrismas          25-12-2012  
Dushera           08-03-2012
Independance Day  15-08-2012

Leave Table

Subject  from_Date     to_Date      Emp_Id     status 
PL       02-01-2012    04-01-2012      1       Approved
CL       11-01-2012    12-01-2012      2       Declined      


Doctor Table

Subject   Call_Date    call_Done_By(emp_id)
 Call     15-01-2012      1
 CA       21-02-2012      2

Chemist Table
Subject   Call_Date    call_Done_By(emp_id)
Chemist   1-02-2012     2
Texo      21-03-2012    1

従業員が医師または化学者に訪問された場合、その特定の日付はその特定の医師または化学者テーブルにemployee_id

今、人は年と月を選択し、彼は次の形式で出席レポートを得ることができるはずです 例:ユーザーが年を「2011」、月を「12月」と選択して出力する必要があるとします。

Employee   year  Month    1  2   3   4   5   6    7.... 
 John      2011   Nov     Y  Y   Y   Y   Y   L    S....
 Scott     2011   Nov     Y  Y   L   M   Y   L    S

ここでは出力1,2,3 ...は0〜30の1ヶ月です。これは 'case'を使って書くことができます

従業員が日にちに「Y」、その他の場合L 彼が医者、化学者のような顧客に行ったら、それを「S」と置き換えてください。

だから、どのようにこの出力を達成するためのクエリを書く必要がありますか? 任意の提案が私に役立つだろう....

1
まだ不明ですか?私に知らせてください。
追加された 著者 Java,
確かに、ちょうどそれをチェックして、私は私の質問を編集しました..そしてはいの列1,2,3は月の日を示します。
追加された 著者 Java,
あなたの結果セットは不明です。 1 2 3 4 ectです。月の日付を参照する見出し列?従業員表にemp_nameという文字を1つだけ表示していますが、結果セットには名前を表示しています。あなたが提供したデータを使って結果セットに例を追加できますか?
追加された 著者 Nightwolf,

1 答え

期待どおりに動作するはずです。

SELECT
    Employee.emp_Name,
    '2011' AS `Year`,
    'Dec' AS `Month`,
    CASE (
        IF(
            DATE('1-12-2011') < DATE(Employee.Joining_Date)),
            '0' --Not joined yet
            IF (
                (SELECT COUNT(*) FROM Holiday WHERE DATE('1-12-2011') = DATE(Holiday.date)) = 1,
                '1', --National Holiday
                IF (
                    (SELECT COUNT(*) FROM Leave WHERE DATE('1-12-2011') > DATE(Leave.to_Date) AND DATE('1-12-2011') < DATE(Leave.from_Date) AND Leave.Emp_Id = Employee.emp_id) = 1,
                    '2', --On Leave
                    IF(
                        (SELECT COUNT(*) FROM Doctor WHERE DATE('1-12-2011') > DATE(Doctor.Call_Date) AND Doctor.call_Done_By = Employee.emp_id) = 1 OR 
                        (SELECT COUNT(*) FROM Chemist WHERE DATE('1-12-2011') > DATE(Chemist.Call_Date) AND Chemist.call_Done_By = Employee.emp_id) = 1,
                        '3' --Visit Doctor or Chemist
                        '4' --Employee was at work
                    )
                )
            )
        )
    )
        WHEN 0 THEN 'N/A' --Not joined yet
        WHEN 1 THEN 'L' --National Holiday
        WHEN 2 THEN 'L' --On Leave
        WHEN 3 THEN 'S' --Visit Doctor or Chemist
        ELSE 'Y' --Employee was at work
    END AS `1`, --first day of month
    ... AS `2`, --repeat for second day of the month till max day of current month replace '1-12-2011' with each different day of month
    ...
    ... AS `30`
FROM
    Employee

私の提案は、各従業員のためにifステートメントを実行するビューを作成し、コードを維持しやすくすることです。これは実行するためにいくつかの変更が必要な疑似コードであることに注意してください。

お役に立てれば。

1
追加された
はい、私はあなたの論理を実行しようとしています、私は短時間であなたに返信します。
追加された 著者 Java,
返信ありがとうございます。本当にありがとうございます。私が何千人もの従業員を抱えていれば、従業員ごとに1000回のビューを作成する必要があります。各従業員の参加日は異なるでしょう。そうですか?または間違った方法で検討していますか?
追加された 著者 Java,
@プラビンゲート:あなたは1つのビューしか書いていませんが、あなたはそれを正しく書く必要があります。ビューには、 emp_id、日付(emp結合後の各日)、値(0,1,2,3,4があるかどうかを判断)があります。 emp_id = employee.emp_idとdate =('01 -12-2011 ')の値が1つの値になるようにし、empごとに1つの日付エントリしかないので、正確な値にする必要があります。
追加された 著者 Nightwolf,
あなたが月の日数を処理しなければならないので、ビューに参加した後の従業員一人一人の毎日のエントリが必要です。年の日付を保持するテーブルを作成することをお勧めします(閏を処理する方法を決定する必要があります年)。次に、それを日付表と結合してビューを作成し、年の各日のエントリを作成することができます。
追加された 著者 Nightwolf,