SQL-запрос для суммирования всех различных значений - PullRequest
0 голосов
/ 21 мая 2018

У меня есть таблица с информацией о рынках:

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

и кладовщик таблицы:

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

Я хочу написать запрос, который находит сводку зарплат (как для кассиров, так и для кладовщиков) для каждого рынка.Результат должен выглядеть следующим образом:

m1 6300
m2 4520

Я пытался присоединиться к рынку таблиц с двумя другими таблицами и использовать SUM(DISTINCT) для зарплат, но это исключает сотрудников с одинаковыми зарплатами.Есть ли другой способ, которым я мог бы сделать это?

Ответы [ 4 ]

0 голосов
/ 21 мая 2018
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;
0 голосов
/ 21 мая 2018
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
0 голосов
/ 21 мая 2018

Вы можете использовать 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
0 голосов
/ 21 мая 2018

У вас действительно очень плохая модель данных, если только вы не намерены сказать, что данный кассир работает несколько раз на одном рынке.

При этом вы можете получить из данных то, что хотите.,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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...