Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Raport obecności w MySQL

Oto długa droga, która powinna działać zgodnie z oczekiwaniami:

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

Moją sugestią jest stworzenie widoku, który wykonuje instrukcję if dla każdego pracownika, dzięki czemu Twój kod będzie łatwiejszy w utrzymaniu. Pamiętaj, że jest to pseudokod, którego uruchomienie może wymagać pewnych zmian.

Mam nadzieję, że to pomoże.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL zwraca pierwszy wiersz połączonej tabeli

  2. Słowo kluczowe MySQL AS

  3. mysql:Jak mogę usunąć znak na początku lub na końcu pola?

  4. Wyświetl otwarte transakcje w MySQL

  5. Zdalne połączenie MySQL w PHP