簡體   English   中英

MYSQL | 從另一個字段中減去一個字段,但是創建了1個子查詢字段

[英]MYSQL | Subtract one field from another but 1 field is created of subquery

SELECT 
E.`employee_id`,
E.`full_name`,
LE.`no_of_leaves` AS AllocatedLeaves,
MLLT.`leave_type` AS LeaveTypeName,
(SELECT COUNT(*) FROM leave_approval WHERE employee_id = 1 AND MONTH(approval_date) = 11 GROUP BY approval_date) AS TotalLeavesTaken,
LE.`no_of_leaves` - TotalLeavesTaken AS Balance
FROM employee E
INNER JOIN leave_entitlement LE
ON E.`employee_id` = LE.`employee_id`
INNER JOIN `ml_leave_type` MLLT
ON MLLT.`ml_leave_type_id` = LE.`ml_leave_type_id`
LEFT JOIN leave_approval LA
ON E.`employee_id` = LA.`employee_id`
LEFT JOIN leave_application LAPP
ON LAPP.`application_id` = LA.`leave_application_id`
LEFT JOIN ml_leave_type MLLTLA
ON MLLTLA.`ml_leave_type_id` = LAPP.`ml_leave_type_id`

Error Code: 1054
Unknown column 'TotalLeavesTaken' in 'field list'

這是我試圖做的,但是出錯了。

LE.`no_of_leaves` - TotalLeavesTaken AS Balance

我在數據庫中不好,我必須從另一個中減去一個字段,第一個字段可以,但是第二個字段是從子查詢中生成的。 我不想再次運行子查詢,是否可以通過某種方式進行減法而無需再次使用子查詢?

除了子查詢之外,您還需要將獲取的總葉子的計算移到派生表中,以便在查詢中的其他地方再次使用它。

另外,子查詢本身看起來不對,您確定要將它與實際員工相關聯嗎? 我不確定您對分組依據的打算是什么,因此我將其省略。

SELECT 
  E.`employee_id`,
  E.`full_name`,
  LE.`no_of_leaves` AS AllocatedLeaves,
  MLLT.`leave_type` AS LeaveTypeName,
  lt.TotalLeavesTaken as TotalLeavesTaken,
  LE.`no_of_leaves` - lt.TotalLeavesTaken AS Balance
FROM employee E
  LEFT JOIN
  (
    SELECT COUNT(*) AS TotalLeavesTaken
     FROM leave_approval 
     WHERE employee_id = E.`employee_id` AND MONTH(approval_date) = 11 
   ) AS lt -- GROUP BY approval_date doesn't make sense to me
  INNER JOIN leave_entitlement LE
    ON E.`employee_id` = LE.`employee_id`
  INNER JOIN `ml_leave_type` MLLT
    ON MLLT.`ml_leave_type_id` = LE.`ml_leave_type_id`
  LEFT JOIN leave_approval LA
    ON E.`employee_id` = LA.`employee_id`
  LEFT JOIN leave_application LAPP
    ON LAPP.`application_id` = LA.`leave_application_id`
  LEFT JOIN ml_leave_type MLLTLA
    ON MLLTLA.`ml_leave_type_id` = LAPP.`ml_leave_type_id`

嘗試這個:

SELECT E.employee_id, E.full_name, LE.no_of_leaves AS AllocatedLeaves,
       MLLT.leave_type AS LeaveTypeName,
      (LE.no_of_leaves - SUM(CASE WHEN LA.employee_id = 1 AND MONTH(LA.approval_date) = 11 THEN 1 ELSE 0 END)) AS balance
FROM employee E
INNER JOIN leave_entitlement LE ON E.employee_id = LE.employee_id
INNER JOIN `ml_leave_type` MLLT ON MLLT.ml_leave_type_id = LE.ml_leave_type_id
LEFT JOIN leave_approval LA ON E.employee_id = LA.employee_id
LEFT JOIN leave_application LAPP ON LAPP.application_id = LA.leave_application_id
LEFT JOIN ml_leave_type MLLTLA ON MLLTLA.ml_leave_type_id = LAPP.ml_leave_type_id
GROUP BY E.employee_id;

編輯

如果您想計算每個員工的請假余額

SELECT E.employee_id, E.full_name, LE.no_of_leaves AS AllocatedLeaves,
       MLLT.leave_type AS LeaveTypeName, LA.TotalLeavesTaken, 
      (LE.no_of_leaves - LA.TotalLeavesTaken) AS balance
FROM employee E
INNER JOIN leave_entitlement LE ON E.employee_id = LE.employee_id
INNER JOIN ml_leave_type MLLT ON MLLT.ml_leave_type_id = LE.ml_leave_type_id
LEFT JOIN (SELECT LA.employee_id, COUNT(1) As TotalLeavesTaken 
           FROM leave_approval LA 
           WHERE MONTH(LA.approval_date) = 11 
           GROUP BY LA.employee_id
         ) AS LA ON E.employee_id = LA.employee_id
LEFT JOIN leave_application LAPP ON LAPP.application_id = LA.leave_application_id
LEFT JOIN ml_leave_type MLLTLA ON MLLTLA.ml_leave_type_id = LAPP.ml_leave_type_id
GROUP BY E.employee_id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM