对所有不同值求和的sql查询

avwztpqn  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(307)

我有一张表,里面有关于市场的信息:

market_id | cashier_id | storekeeper_id

m1        | c1         | s1
m1        | c1         | s2
m1        | c1         | s9
m1        | c2         | s3
m2        | c7         | s5
m2        | c8         | s6

我还有收银台:

cashier_id | salary

c1         | 1100
c2         | 1100
c3         | 1100
c7         | 1220
c8         | 1150

还有table保管员:

storekeeper_id | salary
s1         | 1000
s2         | 1000
s3         | 1000
s5         | 1050
s6         | 1100
s9         | 1100

我想写一个查询,查找每个市场的工资汇总(出纳员和店主)。结果应该是:

m1 6300
m2 4520

我试着和另外两张table一起加入table市场,并使用它们 SUM(DISTINCT) 但这不包括同样薪水的雇员。我还有别的办法吗?

1szpjjfi

1szpjjfi1#

select market_id, sum(salary) from (
    select market_id, sum(salary) salary from 
    (select distinct market_id, cashier_id
    from markets)a
    join cashier b on a.cashier_id=b.cashier_id
    group by market_id
    union all
    select market_id, sum(salary) from
    (select distinct market_id, storekeeper_id
    from markets
     )b
    join storekeeper c on b.storekeeper_id=c.storekeeper_id
    group by market_id)c
group by market_id
nhn9ugyo

nhn9ugyo2#

你可以用 UNION 把出纳和店主的工资结合起来。从那里一个简单的 GROUP BY 会帮你找到你想要的东西。

SELECT market_id, SUM(salary)
FROM (SELECT m.market_id, c.cashier_id, c.salary
      FROM market m
      INNER JOIN cashier c ON c.cashier_id = m.cashier_id
      UNION
      SELECT m.market_id, s.storekeeper_id, s.salary
      FROM market m
      INNER JOIN storekeeper s ON s.storekeeper_id = m.storekeeper_id) tmp
GROUP BY market_id
0vvn1miw

0vvn1miw3#

SELECT k.mid, (sum(k.cs) + sum(k.s_sum))
from (SELECT market_id as mid, market.cashier_id as cid,
cashier.salary as cs, sum(storekeeper.salary) as s_sum
((from markets inner join cashier on markets.cashier_id=cashier.cashier_id) 
inner join storekeeper on markets.storekeeper_id=storekeeper.storekeeper_id)
group by markets.market_id,cashier.cashier_id) as k
group by k.mid;
pbpqsu0x

pbpqsu0x4#

你有一个非常非常糟糕的数据模型,除非你的意图是说一个给定的出纳在一个单一的市场中工作多次。
也就是说,你可以从数据中得到你想要的。 union all 是你的朋友:

select m.market_id, sum(salary)
from ((select distinct m.market_id, c.cashier_id, NULL as storekeeper_id, c.salary
       from markets m join
            cashiers c
            on c.cashier_id = m.cashier_id
      ) union all
      (select distinct m.market_id, NULL, s.storekeeper_id, s.salary
       from markets m join
            storekeepers s
            on s.storekeeper_id = m.storekeeper_id
      )
     ) m
group by m.market_id

相关问题