Как получить список сотрудников вместе с суммой их возмещения за поездку - PullRequest
0 голосов
/ 18 июня 2019

Я хотел бы получить список имен сотрудников и суммы их возмещения за поездку.

Правило: сотрудники имеют право на возмещение только в том случае, если их источник совпадает с пунктом назначения в обратной поездке.

Ввод: Имя таблицы: Возмещение

  Name      From_station      To_station         Amount
    Hari    Bengaluru         Hyderabad    2500
    Hari    Hyderabad         Bengaluru    2600
    Raju    Chennai           Pune         3400
    Raju    Pune              Hyderabad    2000
    Kiran   Kerala            Chennai      2300
    Kiran   Chennai           Kerala       3200

Выход:

Name        Reimbursement_amount
Hari        5100
Kiran       5500

Запрос :

select p.name, amount 
      from(select name,
                  min(from_station) as from_station,
                  min(to_station) as to_station,
                  sum(amount) as amount 
           from reimbursement r1 group by name) p 
where p.from_station = p.to_station 
order by name;

Я на правильном пути?

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Вы можете использовать перекрестное объединение для проверки между пунктами назначения и от места назначения между строками определенного пользователя и вести записи только с использованием соответствующей логики.

Примечание : лучше, если вместо этого можно использовать User_idимени, так как может быть несколько пользователей с одинаковыми именами.

SELECT A.Name, SUM(A.Amount) Reimbursement_amount
FROM Reimburment A
CROSS JOIN Reimburment B
WHERE A.From_station = B.To_station AND A.To_station = B.From_station
AND A.Name = B.Name
GROUP BY A.Name
0 голосов
/ 18 июня 2019

Вы можете сделать это с помощью EXISTS:

select 
  t.Name, 
  sum(t.Amount) Reimbursement_amount
from Reimburment t
where exists (
  select 1 from Reimburment
  where Name = t.Name and From_station = t.To_station and To_station = t.From_station
)
group by t.Name

См. Демоверсию .Результаты:

| Name  | Reimbursement_amount |
| ----- | -------------------- |
| Hari  | 5100                 |
| Kiran | 5500                 |
0 голосов
/ 18 июня 2019

mosdt dbms поддерживают аналитическую функцию first_value и last_value, которую я использовал, чтобы взять мудрое имя 1-е значение от станции и последнее значение на станцию ​​и сравнить их для получения в выборке для повторного разбора

 with reimbursement as
(
select 'Hari' as name, 'Bengaluru' as From_station , 'Hyderabad' as To_station, 2500 as amount
union all
select 'Hari','Hyderabad','Bengaluru',2600
union all
select 'Raju','Chennai','Pune',3400
union all
select 'Raju','Pune','Hyderabad',2000 
union all
select 'Kiran','Kerala','Chennai',2300
union all
select 'Kiran','Chennai','Kerala',3200
),cte as
(
select *,row_number()over(partition by name order by From_station) rn
from reimbursement
), cte1 as
 (select name,amount,
 FIRST_VALUE(From_station) over(partition by name order by rn) as f,
 LAST_VALUE(To_station) over(partition by name  order by rn desc) t
 from cte
 )select name , sum(amount) AS TOTAL 
 FROM reimbursement WHERE name IN (
 select name 
 from cte1 where f=t
 ) GROUP BY NAME

демо oneline

name    TOTAL
Hari    5100
Kiran   5500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...