簡體   English   中英

Mysql查詢用子句從另一個表中的值中減去表中列的總和

[英]Mysql query to subtract sum of a column in a table from a value in another table with clauses

公司里有員工,每個員工每個月都有自己的工資。 員工可以在一個月內多次從他的工資中借到一些錢。

需要顯示員工姓名、工資、上次借入的金額、借入的金額以及特定月份的每筆交易的工資中的剩余金額。

這些是我的表結構:

    CREATE TABLE `employees`
    (
      `Employee_Id` Int NOT NULL AUTO_INCREMENT,
      `Employeer_Name` Char(150) NOT NULL,
      `Job` Varchar(100),
       PRIMARY KEY (`Employee_Id`)
     ) ENGINE = InnoDB
      AUTO_INCREMENT = 1
      ROW_FORMAT = Compact;

    CREATE TABLE `Months`
    (
      `Month_Id` Int NOT NULL AUTO_INCREMENT,
      `Month_Name` Varchar(100),
      PRIMARY KEY (`Month_Id`),
      UNIQUE `Month_Id` (`Month_Id`)
    );

    CREATE TABLE `Employees_Salary`
    (
      `Month_Id` Int NOT NULL,
      `Employee_Id` Int NOT NULL,
      `Salary` Decimal(10,2)
    );

    CREATE TABLE `salary_transaction`
    (
      `Salary_Transaction_Id` Int NOT NULL AUTO_INCREMENT,
      `money_amount` Decimal(10,2) NOT NULL,
      `salary_transaction_date` Date NOT NULL,
      `Month_Id` Int,
      `Employee_Id` Int,
      PRIMARY KEY (`Salary_Transaction_Id`)
    ) ENGINE = InnoDB
     AUTO_INCREMENT = 1
     ROW_FORMAT = Compact;
ALTER TABLE `Employees_Salary` ADD PRIMARY KEY (`Month_Id`,`Employee_Id`);
    
ALTER TABLE `Employees_Salary` ADD CONSTRAINT `Relationship41` FOREIGN KEY (`Month_Id`) 
  REFERENCES `Months` (`Month_Id`) 
  ON DELETE CASCADE ON UPDATE CASCADE;
    
ALTER TABLE `Employees_Salary` ADD CONSTRAINT `Relationship42` FOREIGN KEY (`Employee_Id`) 
  REFERENCES `employees` (`Employee_Id`) 
  ON DELETE CASCADE ON UPDATE CASCADE;
    
ALTER TABLE `salary_transaction` ADD CONSTRAINT `Relationship43` FOREIGN KEY (`Month_Id`, `Employee_Id`) 
  REFERENCES `Employees_Salary` (`Month_Id`, `Employee_Id`) 
  ON DELETE CASCADE ON UPDATE CASCADE;

我試過這個代碼,但它只從工資中減去最后借的錢

SELECT e.employee_id, e.employee_name, es.Month_Id, es.Salary, m.Month_Id, s.money_amount, 
    es.Salary-s.money_amount 
  FROM employees e 
  JOIN Employees_Salary es ON e.Employee_Id=es.Employee_Id 
  INNER JOIN Months m ON es.Month_Id=m.Month_Id 
  INNER JOIN salary_transaction s 
  WHERE es.Month_Id=1 AND es.Employee_Id=1 
 ORDER BY Salary_Transaction_Id DESC 
LIMIT 1  

dbfiddle.uk 網站中的所有代碼

首先,您在INNER JOIN salary_transaction s之后缺少ON並且由於您專門尋找WHERE es.Month_Id=1 AND es.Employee_Id=1 ,我認為不需要ORDER BY Salary_Transaction_Id DESCLIMIT 1 暫時,讓我們刪除它。 你需要的實際上是一個SUM()的總被借用和一個GROUP BY 像這樣的東西:

SELECT e.employee_id, e.employee_name, es.Month_Id, es.Salary, m.Month_Id,
       SUM(s.money_amount) AS "Total Borrowed", 
       es.Salary-SUM(s.money_amount) AS "Salary Balance"
  FROM employees e 
  JOIN Employees_Salary es ON e.Employee_Id=es.Employee_Id 
  INNER JOIN Months m ON es.Month_Id=m.Month_Id 
  INNER JOIN salary_transaction s ON e.Employee_Id=s.Employee_Id 
  WHERE es.Month_Id=1 AND es.Employee_Id=1 
  GROUP BY e.employee_id, e.employee_name, es.Month_Id, es.Salary, m.Month_Id;

這是您更新的小提琴: https ://dbfiddle.uk/ ? rdbms = mysql_8.0 & fiddle =3fbebdeccf3bc910339dd143e3bcf3c7

暫無
暫無

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

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