Мне нужно объединить несколько таблиц в Access для отчета:

  • Customer: есть вся информация о клиенте
CustomerID| Name
----------+-----------
1         | Jim
2         | Bob

  • Order: содержит все данные заказа, связанные с клиентом
OrderID | CustomerID 
--------+------------
1       | 1          
2       | 2  
3       | 2                 
  • Sales: все товары проданы за заказ
OrderID| ItemID
-------+-----
1      | 1
1      | 1
2      | 3
3      | 2
  • Item: есть стоимость каждого предмета
ItemID | Cost
-------+-----
1      | 5
2      | 30
3      | 15
  • Shipping: стоимость доставки за единицу
OrderID| ShippingCost
-------+-----
1      | 25
2      | 25
3      | 25

Я хочу вернуть результаты как:

Name | Total ItemCost | Total ShippingCost | Total Cost|
-----+----------------+--------------------+-----------
JIM  | 10             | 25                 |35
BOB  | 30             | 25                 |55
BOB  | 15             | 25                 |40

По сути, я хочу связать идентификатор клиента с его заказом. Затем свяжите стоимость товара с заказом и суммируйте результаты по заказу. Тогда я хочу связать стоимость доставки за заказ. Наконец, я хочу, чтобы все сгруппировалось по orderID, и все значения были сопоставлены.

Я упростил пример, чтобы было легче ответить, но запрос, который я смог выполнить в другом ORACLE SQL DEVELOPER, был следующим (это не будет работать в Access):

select 
person.first_name, 
person.last_name,
"Total Damages",
("Room Rate" * ROUND((A.CHECK_OUT_DATE - A.CHECK_IN_DATE))) as "Total Room Cost", 
"Total Deposit",
SUM("Total Deposit" + "Total Damages" + ("Room Rate" * ROUND((A.CHECK_OUT_DATE - A.CHECK_IN_DATE)))) as "Total Cost Exluding Total Room Cost"
from person
join CUSTOMER
on person.personid = customer.personid
join Hotel_Booking A
on A.customerid = customer.customerid
join (
select damage_charge.HOTEL_BOOKINGID as "DAMAGE", SUM(DAMAGE_RATE) as "Total Damages"
from damage_charge
join hotel_damages
on hotel_damages.HOTEL_DAMAGESID = damage_charge.HOTEL_DAMAGESID
where hotel_bookingid = damage_charge.HOTEL_BOOKINGID
group by damage_charge.HOTEL_BOOKINGID
)
on A.hotel_bookingid = DAMAGE
join (
select HOTEL_BOOKINGID as "ROOM", ROOM_RATE as "Room Rate"
from Room_Charge
join Hotel_Room_Rate 
on Room_Charge.HOTEL_ROOM_RATEID = Hotel_Room_Rate.HOTEL_ROOM_RATEID
)
on A.hotel_bookingid = ROOM
join (
select HOTEL_BOOKINGID as DEPOSIT, Deposit_Rate as "Total Deposit"
from Room_Charge
join Hotel_Deposit_Rate  
on Room_Charge.HOTEL_DEPOSIT_RATEID = Hotel_Deposit_Rate.HOTEL_DEPOSIT_RATEID
)
on A.hotel_bookingid = DEPOSIT
where ("Total Deposit" + "Total Damages" + ("Room Rate" * ROUND((A.CHECK_OUT_DATE - A.CHECK_IN_DATE)))) > 50
group by person.first_name, person.last_name, A.HOTEL_BOOKINGID, ROUND((A.CHECK_OUT_DATE - A.CHECK_IN_DATE)), "Total Damages", "Room Rate", "Total Deposit"
order by SUM("Total Deposit" + "Total Damages") DESC
;
sql
0
BoogerBrain88 12 Фев 2020 в 03:41

2 ответа

Лучший ответ

Хмммм , , Исходя из ваших описаний, t enter code here должен работать на вас:

select c.name, sum(itemcost) as itemcost, sum(shippingcost) as shippingcost,
       sum(itemcost)+ sum(shippingcost)
from ((customer as c left join
       orders as o
      ) on o.customerid = c.customerid left join
      (select s.orderid, sum(i.cost) as itemcost
       from sales as s inner join
            items as i
            on i.itemid = s.itemid
       group by s.orderid
      ) as si
     ) on si.orderid = o.orderid left  join
     shipping sh
     on sh.orderid = o.orderid
group by c.name;

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

0
Gordon Linoff 12 Фев 2020 в 00:54

Запрос должен работать в MS Access с несколькими настройками:

  • Удалите двойные кавычки из идентификаторов столбцов или таблиц. Вместо этого используйте квадратные скобки или обратные галочки, чтобы экранировать специальные символы, пробелы или зарезервированные слова.
  • Определите JOIN как INNER JOIN
  • Заключите JOIN пары в круглые скобки, включая подзапросы

Рассмотрим ниже скорректированный SQL:

select person.first_name, 
       person.last_name, 
       dmg.[Total Damages], 
       (rate.[Room Rate] * ROUND((h.CHECK_OUT_DATE - h.CHECK_IN_DATE))) as [Total Room Cost], 
       dep.[Total Deposit], 
       SUM(dep.[Total Deposit] + dmg.[Total Damages] + 
            (rate.[Room Rate] * ROUND((h.CHECK_OUT_DATE - h.CHECK_IN_DATE)))) as [Total Cost Exluding Total Room Cost] 
from ((((Hotel_Booking h
inner join (CUSTOMER
            inner join person on person.personid = customer.personid) 
    on h.customerid = customer.customerid)
inner join 
    ( select damage_charge.HOTEL_BOOKINGID as [DAMAGE], SUM(DAMAGE_RATE) as [Total Damages] 
      from damage_charge 
      inner join hotel_damages
         on hotel_damages.HOTEL_DAMAGESID = damage_charge.HOTEL_DAMAGESID 
      where hotel_bookingid = damage_charge.HOTEL_BOOKINGID 
      group by damage_charge.HOTEL_BOOKINGID )) dmg 
   on h.hotel_bookingid = dmg.DAMAGE 
inner join 
     ( select HOTEL_BOOKINGID as [ROOM], ROOM_RATE as [Room Rate] 
       from Room_Charge
       inner join Hotel_Room_Rate
         on Room_Charge.HOTEL_ROOM_RATEID = Hotel_Room_Rate.HOTEL_ROOM_RATEID )) rate
   on h.hotel_bookingid = rate.ROOM 
inner join 
     ( select HOTEL_BOOKINGID as DEPOSIT, Deposit_Rate as [Total Deposit] 
       from Room_Charge 
       inner join Hotel_Deposit_Rate 
         on Room_Charge.HOTEL_DEPOSIT_RATEID = Hotel_Deposit_Rate.HOTEL_DEPOSIT_RATEID )) dep
    on h.hotel_bookingid = dep.DEPOSIT
where (dep.[Total Deposit] + dmg.[Total Damages] + 
       (rate.[Room Rate] * ROUND((h.CHECK_OUT_DATE - h.CHECK_IN_DATE)))) > 50 
group by person.first_name, person.last_name, h.HOTEL_BOOKINGID, 
         ROUND((h.CHECK_OUT_DATE - h.CHECK_IN_DATE)), 
         dmg.[Total Damages], rate.[Room Rate], dep.[Total Deposit] 
order by SUM(dep.[Total Deposit] + dmg.[Total Damages]) DESC ;

Без фактической базы данных выше все еще может потребоваться корректировка. Для сложных запросов всегда используйте Query Designer для создания объединений с использованием таблиц GUI. Вы можете сохранить подзапросы как свои собственные запросы, чтобы объединить их в окончательный запрос в виде таблиц.

Надеемся, мы сможем убедить команду Microsoft Access в один прекрасный день обновить Access до стандартов ANSI SQL. Для OP и будущих читателей, пожалуйста, поддержите предложение (вход в систему не требуется)!

0
Parfait 12 Фев 2020 в 01:22