Mysql 如何连接两个表并进行数学计算
我有两张桌子,员工明细表和组合表。我想添加CompOff表的行,我得到的每行计数结果应该添加到EmployeeDetails表的列中。我用了漏接法。请帮我输入这个代码Mysql 如何连接两个表并进行数学计算,mysql,sql,left-join,inner-join,Mysql,Sql,Left Join,Inner Join,我有两张桌子,员工明细表和组合表。我想添加CompOff表的行,我得到的每行计数结果应该添加到EmployeeDetails表的列中。我用了漏接法。请帮我输入这个代码 SELECT a.EmpID, a.EmpName, a.Department, a.Designation, a.TotalLeaves, COUNT(b.EmpName) AS TotalCompOff FROM (EmployeeDetails
SELECT
a.EmpID,
a.EmpName,
a.Department,
a.Designation,
a.TotalLeaves,
COUNT(b.EmpName) AS TotalCompOff
FROM (EmployeeDetails a LEFT OUTER JOIN
(CompOffTable b ON a.EmpName = b.EmpName)
INNER JOIN SUM(a.TotalLeaves + TotalCompOff) AS RemainingLeaves )
GROUP BY a.EmpID, a.EmpName, a.Department, a.Designation, a.TotalLeaves
您不能加入该计算。假设计算是您正在寻找的,请尝试以下操作,将其移回select子句。还要注意,不能在同一select子句中引用列别名totalcompoff。您只需重复到达COUNTb.empname列的方法即可。顺便说一句,这并不会降低查询的效率
SELECT
a.empid
, a.empname
, a.department
, a.designation
, a.totalleaves
, COUNT(b.empname) AS totalcompoff
, SUM(a.totalleaves + COUNT(b.empname)) AS remainingleaves
FROM employeedetails a
LEFT OUTER JOIN compofftable b ON a.empname = b.empname
GROUP BY
a.empid
, a.empname
, a.department
, a.designation
, a.totalleaves
如果db类型/版本不允许该构造,则使用派生表方法,此处可以重新使用列别名:
SELECT
d.empid
, d.empname
, d.department
, d.designation
, d.totalleaves
, d.totalcompoff
, SUM(d.totalleaves + d.totalcompoff) AS remainingleaves
FROM (
SELECT
a.empid
, a.empname
, a.department
, a.designation
, a.totalleaves
, COUNT(b.empname) AS totalcompoff
FROM employeedetails a
LEFT OUTER JOIN compofftable b ON a.empname = b.empname
GROUP BY
a.empid
, a.empname
, a.department
, a.designation
, a.totalleaves
) d
如果你的数据是这样的
MariaDB [sandbox]> select e.emp_no,e.last_name, e.holiday_entitlement
-> from employees e;
+--------+-----------+---------------------+
| emp_no | last_name | holiday_entitlement |
+--------+-----------+---------------------+
| 1 | AAA | 30 |
| 2 | BBB | 30 |
| 3 | CCC | 30 |
| 4 | DDD | 30 |
| 5 | EEE | 30 |
| 6 | FFF | 30 |
| 7 | GGG | 30 |
+--------+-----------+---------------------+
7 rows in set (0.00 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> select id , entity_id , date_from , date_to
-> from holiday_table;
+------+-----------+------------+------------+
| id | entity_id | date_from | date_to |
+------+-----------+------------+------------+
| 1 | 1 | 2017-01-01 | 2017-01-01 |
| 2 | 1 | 2017-02-01 | 2017-02-01 |
| 3 | 2 | 2017-01-01 | 2017-01-01 |
+------+-----------+------------+------------+
3 rows in set (0.00 sec)
这样就可以了
MariaDB [sandbox]> select e.emp_no,e.last_name, e.holiday_entitlement
-> ,ifnull((select sum(datediff(date_to,date_from) + 1) from holiday_table h where h.entity_id = e.emp_no), e.holiday_entitlement) entitlement
-> , ifnull(e.holiday_entitlement - (select sum(datediff(date_to,date_from) + 1) from holiday_table h where h.entity_id = e.emp_no),0) LeaveRemaining
-> from employees e;
+--------+-----------+---------------------+-------------+----------------+
| emp_no | last_name | holiday_entitlement | entitlement | LeaveRemaining |
+--------+-----------+---------------------+-------------+----------------+
| 1 | AAA | 30 | 2 | 28 |
| 2 | BBB | 30 | 1 | 29 |
| 3 | CCC | 30 | 30 | 0 |
| 4 | DDD | 30 | 30 | 0 |
| 5 | EEE | 30 | 30 | 0 |
| 6 | FFF | 30 | 30 | 0 |
| 7 | GGG | 30 | 30 | 0 |
+--------+-----------+---------------------+-------------+----------------+
7 rows in set (0.00 sec)
这可能是我在你的帮助下发现的一个正确答案
SELECT
d.empid
, d.empname
, d.department
, d.designation
, d.totalleaves
, d.totalcompoff
, SUM(d.totalleaves + d.totalcompoff) AS remainingleaves
FROM (
SELECT
a.empid
, a.empname
, a.department
, a.designation
, a.totalleaves
, COUNT(b.empname) AS totalcompoff
FROM employeedetails a
LEFT OUTER JOIN compoff b ON a.empname = b.empname
GROUP BY
a.empid
, a.empname
, a.department
, a.designation
, a.totalleaves
) d
GROUP BY
d.empid
, d.empname
, d.department
, d.designation
, d.totalleaves
, d.totalcompoff
ms access和mysql是两种截然不同的产品。请编辑您的问题以删除错误的问题。已编辑。如何改进我的查询@ZoharPeledI不确定我是否理解这个问题。作为DDL+DML的示例数据和所需的结果应该会有所帮助。在表达式SUMa.TotalLeaves+COUNTb.EmpName error@Used\u By\u AlreadyaAdded alternative method.@Used\u By\u AlreadyaAdded alternative method中不能有聚合函数。您确定该替代方法吗?当使用MariaDB运行此命令时,我只得到一行—请参阅dbfiddle、倒数第二个查询和最后一个查询。不走运:错误现在表示您尝试执行的查询不包含指定表达式EmpID@Used\u By\u AlreadyVery。事实上,EmpID在上述查询中列出了3次。我不知道MySQL是区分大小写的,但是你可以试试EmpID。是我的错。忘了我在外部查询中使用了SUM。干得好。没问题。你给了我90%的答案,其余的我都算出来了。再次感谢@Used\u已经
SELECT
d.empid
, d.empname
, d.department
, d.designation
, d.totalleaves
, d.totalcompoff
, SUM(d.totalleaves + d.totalcompoff) AS remainingleaves
FROM (
SELECT
a.empid
, a.empname
, a.department
, a.designation
, a.totalleaves
, COUNT(b.empname) AS totalcompoff
FROM employeedetails a
LEFT OUTER JOIN compoff b ON a.empname = b.empname
GROUP BY
a.empid
, a.empname
, a.department
, a.designation
, a.totalleaves
) d
GROUP BY
d.empid
, d.empname
, d.department
, d.designation
, d.totalleaves
, d.totalcompoff