Mysql 如何连接两个表并进行数学计算

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

我有两张桌子,员工明细表和组合表。我想添加CompOff表的行,我得到的每行计数结果应该添加到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