Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tính số ngày có mặt và vắng mặt trong bảng

Bạn có thể thử truy vấn dưới đây:

SELECT e.comp_mkey, e.status,   e.resig_date,   dt_of_leave,    e.emp_name,
   e.date_of_joining,  e.emp_card_no,   a.pl_days,    pl_days_opening,    a.month1,
   a.month2,   a.month3,   a.month4,   a.month5,   a.month6,   a.month7,   a.month8,
   a.month9,   a.month10,   a.month11,   a.month12,       
   a.month1 + a.month2 + a.month3 + a.month4 + a.month5 + a.month6 +   a.month7 + a.month8 + a.month9 + +a.month10 + a.month11 + a.month12 AS pl_sum,
   m.[DaysAbsent],m.[DaysPresent]
  FROM p_leave_allocation AS a
   INNER JOIN
   emp_mst AS e
   ON a.emp_card_no = e.emp_card_no
   INNER JOIN
   (
   SELECT 
        comp_mkey,emp_mkey,[month],[year], 
        SUM(CASE WHEN data ='AB' THEN 1 ELSE 0 END) AS [DaysAbsent],
        SUM(CASE WHEN data ='P' THEN 1 ELSE 0 END) AS [DaysPresent]
    FROM
        (
        SELECT comp_mkey,emp_mkey,[month],[year],[Day1],[Day2],[Day3],[Day4],[Day5]
        --,...  
        FROM Emp_mon_day
        ) source
        UNPIVOT
        (
        data FOR day IN ([Day1],[Day2],[Day3],[Day4],[Day5]) -- dynamic query can generate all days data
        )up
        GROUP BY comp_mkey, emp_mkey,[month],[year]
   ) AS m
   ON m.comp_mkey=e.Comp_mkey and m.emp_mkey=e.mkey
   --- ABOVE CRITERIA NEEDS TO BE CHECKED
  WHERE  a.year = 2016
   AND (datediff(MONTH, e.date_of_joining, CONVERT (DATETIME, getdate(), 103)) >= 6
        AND datediff(MONTH, e.date_of_joining, CONVERT (DATETIME, getdate(), 103)) <= 36)
   AND (e.resig_date IS NULL
        OR (e.dt_of_leave IS NOT NULL
            AND e.dt_of_leave >= CONVERT (DATETIME, getdate(), 103)))
   AND e.status IN ('A', 'S')
   AND e.comp_mkey IN (7, 110)
   AND a.Year = 2016;

Giải thích:

Chúng tôi đã thêm một INNER JOIN khác vào truy vấn hiện có để lấy dữ liệu đối chiếu của DaysPresentDaysAbsent

Để tối ưu hóa điều này hơn nữa, tôi khuyên bạn nên áp dụng trực tiếp WHERE sau mệnh đề đến source đặt

WHERE  comp_mkey IN (7, 110) AND Year = 2016;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tôi có thể bước vào một chương trình SQL Server được lưu trữ từ mã C # của tôi?

  2. Làm cách nào để cắt bớt ngày giờ trong SQL Server?

  3. Điều gì xảy ra với một giao dịch không được cam kết khi kết nối bị đóng?

  4. Cách kiểm tra mức độ tương thích của cơ sở dữ liệu trong SQL Server bằng T-SQL

  5. Nếu không tồn tại, không thành công trên SQL CE