Sql 如何在firebird中的两个不同表中获得两个不同的总数?(使用左外连接连接3个表)

Sql 如何在firebird中的两个不同表中获得两个不同的总数?(使用左外连接连接3个表),sql,database,left-join,firebird,Sql,Database,Left Join,Firebird,我有3个表,下面列出了示例数据 Table #1 EMPLOYEE EMPLOYEE ID EMPLOYEE_NAME 1 Juan Dela Cruz 2 Jobert Saver Table #2 ADD_TABLE ADD_TABLE_PK EMPLOYEE_ID ADD_AMOUNT 1 1 10.00 2

我有3个表,下面列出了示例数据

Table #1 EMPLOYEE
EMPLOYEE ID      EMPLOYEE_NAME
     1           Juan Dela Cruz
     2           Jobert Saver

Table #2 ADD_TABLE
ADD_TABLE_PK    EMPLOYEE_ID    ADD_AMOUNT
     1               1            10.00
     2               1            13.00

Table #3 SUBTRACT_TABLE
SUBTRACT_PK     EMPLOYEE_ID     SUBTRACT_AMOUNT
    1                1               2.00
    2                1               3.00
    3                1               4.00
我期望的输出如下所示:

SELECT PROCEDURE

EMPLOYEE_ID  EMPLOYEE_NAME     TOTAL(Total = sum of ADD_TABLE.ADD_AMOUNT - sum of SUBTRACT_TABLE.SUBTACT_AMOUNT)
     1       Juan Dela Cruz     14.00 ( = 23.00 - 9.00)
但我的选择程序的结果是:

EMPLOYEE_ID  EMPLOYEE_NAME     TOTAL
     1       Juan Dela Cruz   51.00
这是我使用左外连接的select处理器

CREATE PROCEDURE SAMPLE_SELECT
RETURNS(
  EMPLOYEE_ID INTEGER,
  EMPLOYEE_NAME VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
  TOTAL DECIMAL(12, 2))
AS
BEGIN
  FOR
    SELECT
      A.EMPLOYEE_ID,
      A.EMPLOYEE_NAME,
      SUM(B.ADD_AMOUNT) - SUM(C.SUBTRACT_AMOUNT)

    FROM EMPLOYEE A
    LEFT OUTER JOIN ADD_TABLE B ON A.EMPLOYEE_ID = B.EMPLOYEE_ID
    LEFT OUTER JOIN SUBTRACT_TABLE C ON A.EMPLOYEE_ID = C.EMPLOYEE_ID

    GROUP BY
     A.EMPLOYEE_ID,
      A.EMPLOYEE_NAME
    INTO
      :EMPLOYEE_ID,
      :EMPLOYEE_NAME,
      :TOTAL
  DO
    BEGIN
      SUSPEND;
    END
END;

您需要在加入表之前进行聚合:

select e.*, coalesce(add_amount, 0) - coalesce(subtract_amount, 0) 
from employee e left join
     (select employee_id, sum(add_amount) as add_amount
      from add_table a
      group by employee_id
     ) a
     on a.employee_id = e.employee_id left join
     (select employee_id, sum(subtract_amount) as subtract_amount
      from subtract_table s
      group by employee_id
     ) s
     on s.employee_id = e.employee_id;

注意:这将保留所有员工。您的查询尝试使用左连接,因此也可以使用左连接。

使用Firebird 2.5测试,更直接:

Select e1.employee_id, e1.employee_name, (Select Coalesce(Sum(a1.add_amount), 0) From add_table a1 Where a1.employee_id = e1.employee_id) - (Select Coalesce(Sum(s1.subtract_amount), 0) From subtract_table s1 Where s1.employee_id = e1.employee_id) As total From employee e1
1我希望您确实从表2和表3到表12制作了外键,以供实际使用。该查询最好是持久化的,而不是作为一个过程,而是作为一个视图。顺便问一下,您现在是否了解51.00的来源,该数字是如何计算的?尝试使用Martin Gruber的经典SQL