Mysql 查询求和和减法求和表

Mysql query sum and Subtraction sum tabels

我需要这个查询

Table 基础:

Id name
1  ex1
2  ex2
3  ex3

Table一个

ExtId  p
1      10
1      20
2      40
3      10
3      10

TableB

ExtId  p
1      10
1      5
3      5
3      5

Table C

ExtId  p
1      10
2      10
2      20
3      40

输出:

Table A.p + Table B.p - Table C.p:

id   p
1    35
2    10
3   -10
select B1.id, coalesce(Q1.p,0) + coalesce(Q2.p,0) - coalesce(Q3.p,0) as p
from Base B1
left join 
    (
    select ExtId, sum(p) as p
    from TableA
    group by ExtID
    ) Q1
  on B1.id = Q1.ExtID
left join 
    (
    select ExtId, sum(p) as p
    from TableB
    group by ExtID
    ) Q2
  on B1.id = Q2.ExtID
left join 
    (
    select ExtId, sum(p) as p
    from TableC
    group by ExtID
    ) Q3
  on B1.id = Q3.ExtID

尝试对您的 ID 值总和进行分组,然后计算它们:

SELECT
      A.id
    , A.P + B.p - C.p
FROM
    [Table Base] AS T
         INNER JOIN
    (
    SELECT
          ExtId
        , SUM(p) AS [p]
    FROM
        [Table A] AS A
    GROUP BY
        ExtId
    ) AS A
        ON T.id = A.ExtId
        INNER JOIN
    (
    SELECT
          ExtId
        , SUM(p) AS [p]
    FROM
        [Table B] AS B
    GROUP BY
        ExtId
    ) AS B
        ON T.id = B.ExtId
        INNER JOIN
    (
    SELECT
          ExtId
        , SUM(p) AS [p]
    FROM
        [Table C] AS C
    GROUP BY
        ExtId
    ) AS C
        ON T.id = C.ExtId

我的解决方案如下:-

CREATE TABLE Base (Id INT, name NVARCHAR(10))
INSERT INTO Base VALUES (1, 'ex1'), (2, 'ex2'), (3, 'ex3')

CREATE TABLE TableA (ExtId INT, p INT)
CREATE TABLE TableB (ExtId INT, p INT)
CREATE TABLE TableC (ExtId INT, p INT)

INSERT INTO TableA VALUES (1, 10), (1, 20), (2, 40), (3, 10), (3, 10)
INSERT INTO TableB VALUES (1, 10), (1, 5), (3, 5), (3, 5)
INSERT INTO TableC VALUES (1, 10), (2, 10), (2, 20), (3, 40)

SELECT BS.Id, BS.name, ISNULL(A.A_total, 0) + ISNULL(B.B_total, 0) - ISNULL(C.C_total, 0)
FROM Base BS
LEFT JOIN (SELECT ExtId, SUM(p) AS A_total FROM TableA GROUP BY ExtId) A ON BS.Id = A.ExtId
LEFT JOIN (SELECT ExtId, SUM(p) AS B_total FROM TableB GROUP BY ExtId) B ON BS.Id = B.ExtId
LEFT JOIN (SELECT ExtId, SUM(p) AS C_total FROM TableC GROUP BY ExtId) C ON BS.Id = C.ExtId
ORDER BY BS.Id