sql >> データベース >  >> RDS >> Mysql

MySqlの出席レポート

    期待どおりに機能するはずの長い道のりは次のとおりです。

    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. Oracleで内部結合を使用して更新する方法

    2. DBに接続せずにmysql_real_escape_stringの代わりに

    3. WEEKOFYEAR()の例– MySQL

    4. PostgreSQLデータベースを保護する方法-10のヒント