Умножить столбцы из отдельных таблиц - PullRequest
0 голосов
/ 17 октября 2019

У меня есть две таблицы RepairDetails и Repairs.

. Внутри таблицы Repairs приведен список предлагаемых нами видов ремонта и их стоимость.

+-------------+---------------+
| repair_desc | repair_price  |
+-------------+---------------+
|  BasicHB    |   50.00       |
|  AdvHB      |   80.00       |
|  CCRepair   |   40.00       |
|  CCReplace  |   80.00       |
+-------------+---------------+

Внутри таблицы RepairDetails находится запись unit_id, и к каждому unit_id прикреплен detail_id, в котором указан номер каждого типа ремонта, примененного к устройству.

+-----------+-----------+----------+-------+----------+-----------+
| detail_id |  unit_id  |  BasicHB | AdvHB | CCRepair | CCReplace |  
+-----------+-----------+----------+-------+----------+-----------+
|  1        |     1     |     2    |  0    |   0      |   1       |
+-----------+-----------+----------+-------+----------+-----------+

unit_id используется в качестве первичного ключа в другой таблице, которая связывает его с order_id, а затем order_id является первичным ключом в другой таблице, которая связывает его с customer_id.

Мне нужно создать запрос, который будет принимать значение в столбцах таблицы RepairDetails и умножать их на соответствующий столбец repair_cost в таблице Repairs. В конце я хотел бы иметь возможность сделать этот запрос на основе customer_id. Здесь я немного теряюсь, потому что уверен, что будет больше одного JOIN, который можно получить от customer_id до order_id до unit_id до detail_id. Любая помощь в этом направлении будет также оценена!

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Ваша модель данных - это боль. Почему одни в столбцах, а другие в строках? Я бы развернул таблицы, чтобы они имели одинаковую структуру:

select rd.*,
       (rd.BasicHB * r.BasicHB) as BasicHB_price,
       (rd.AdvHB * r.AdvHB) as AdvHB_price,
       (rd.CCRepair * r.CCRepair) as CCRepair_price,
       (rd.CCReplace * r.CCReplace) as CCReplace_price,
from repairdetails rd cross join
     (select max(case when repair_desc = 'BasicHB' then repair_price end) as BasicHB,
             max(case when repair_desc = 'AdvHB' then repair_price end) as AdvHB,
             max(case when repair_desc = 'CCRepair' then repair_price end) as CCRepair,
             max(case when repair_desc = 'CCReplace' then repair_price end) as CCReplace             
      from repairs r
     ) r;
0 голосов
/ 17 октября 2019

Вы можете попробовать этот код:

select  detail_id
      , unit_id
      , BasicHB*(select repair_price from Repairs where repair_desc = 'BasicHB') 
          as BasicHB_RepairDetailCost
      , AdvHB*(select repair_price from Repairs where repair_desc = 'AdvHB') 
          as AdvHB_RepairDetailCost
      , CCRepair*(select repair_price from Repairs where repair_desc = 'CCRepair') 
          as CCRepair_RepairDetailCost
      , CCReplace*(select repair_price from Repairs where repair_desc = 'CCReplace') 
          as CCReplace_RepairDetailCost
from RepairDetails
--inner join Units on (Units.unit_id = RepairDetails.unit_id)
--inner join Orders on (Orders.order_id = Units.order_id)
--inner join Customers on (Customers.customer_id = Orders.customer_id)
--where Customers.customer_id = 

В этом базовом масштабе он должен работать как для Oracle, так и для SQL Server.

Если это не то, что вы ищете, укажите это в комментариях, и я постараюсь настроить его для вас.

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