SQL-запрос соединения для представления с суммой столбцов в 3 таблицах - PullRequest
0 голосов
/ 18 января 2019

У меня есть 3 таблицы, как показано ниже

    Table - travel_requests
    id  industry_id travel_cost stay_cost   other_cost
    1   2           1000        500         200
    2   4           4000        100         200
    3   5           3000        0           400
    4   1           3000        250         100
    5   1           200         100         75

    Table - industry_tech_region
    id  industry_name
    1   Auto
    2   Aero
    3   Machinery
    4   Education
    5   MTV

    Table - industry_allocation
    id  industry_id allocation
    1   1           500000
    2   2           300000
    3   3           500000
    4   4           300000
    5   5           500000
    6   1           200000

Я хочу создать представление с 3 столбцами

industry_name, total_costs, total_allocation

Я создал вид как показано ниже

SELECT  industry_tech_region.industry_name,     
    SUM(travel_requests.travel_cost + travel_requests.stay_cost + travel_requests.other_cost) AS total_cost,
    SUM(industry_allocation.allocation) AS total_allocation
FROM  industry_tech_region 
  INNER JOIN industry_allocation 
      ON industry_tech_region.id = industry_allocation.industry_id 
  INNER JOIN travel_requests 
      ON industry_tech_region.id = travel_requests.industry_id
GROUP BY industry_tech_region.industry_name

Но результат, который я получаю, как показано ниже, является неправильным

industry_name   total_cost  total_allocation
Aero            1700        300000
Auto            7450        1400000 (wrong should be 3725 and 700000)
Education       4300        300000
MTV             3400        500000

Вероятно, это происходит потому, что в таблице travel_requests есть 2 записи для industry_id 1. Но они должны учитываться только один раз.

Пожалуйста, дайте мне знать, как мы можем исправить утверждение вида.

Кроме того, я хочу добавить еще один столбец, который представляет собой остаток_аллокации, который представляет собой разницу между итоговой_отделением и общей_ценкой для каждой отрасли.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы также можете использовать этот подход (без ORDER BY, потому что представления не позволяют этого).

;WITH q AS (
SELECT industry_id
    , sum(allocation) AS total_allocation
FROM #industry_allocation
GROUP BY industry_id
)
SELECT  #industry_tech_region.industry_name
    , isnull(SUM(#travel_request.travel_cost
     + #travel_request.stay_cost
     + #travel_request.other_cost),0.0) AS total_cost
    ,q.total_allocation AS total_allocation
FROM  #industry_tech_region 
    LEFT JOIN q ON #industry_tech_region.id = q.industry_id 
    LEFT JOIN #travel_request ON #industry_tech_region.id = #travel_request.industry_id
GROUP BY #industry_tech_region.industry_name,q.total_allocation
ORDER BY industry_name
0 голосов
/ 18 января 2019

вы должны присоединиться к сумме (а не к сумме объединения)

  select          
      a.industry_name
      , t1.total_cost 
      , t2.total_allocation 
  from dbo.industry_tech_region  a
  left join  (
    select dbo.travel_requests.industry_id
      , SUM(dbo.travel_requests.travel_cost + dbo.travel_requests.stay_cost + dbo.travel_requests.other_cost) AS total_cost
    FROM bo.travel_requests
    group by dbo.travel_requests.industry_id
  )  t1 on a.id = t1.industry_id 
  left join (
    select  dbo.industry_allocation.industry_id 
     , SUM(dbo.industry_allocation.allocation) AS total_allocation
    from  dbo.industry_allocation 
    group by dbo.industry_allocation.industry_id   

  ) t2 on a.id = t2.industry_id

это происходит потому, что у вас есть две записи для industry_id 1, а затем строка соединяется два раза, если вы используете подзапрос для агрегированной строки, этого не может быть ...

Я использовал левое соединение, потому что кажется, что не все отраслевые идентификаторы совпадают для 3 таблиц.

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