sql - 访问子查询连接
问题描述
我需要在 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
本质上,我想将客户 ID 链接到他们的订单。然后将项目成本链接到订单,并对每个订单的结果求和。然后我想链接每个订单的运费。最后,我希望所有内容都按 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
;
解决方案
嗯。. . 根据您的描述,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;
我不知道您的示例查询与您的问题有什么关系。表不同,列不同,都有过滤条件。
推荐阅读
- javascript - php 搜索结果表的行为与原始表不同
- jquery - 仅选择父元素中具有特定样式的元素
- c# - 如何通过幻灯片将 PIE 图放入 Power-point 演示文稿中
- amazon-web-services - 适用于私有容器映像的 AWS Batch
- php - Firebase 动态链接信息与 google-api-php-client v2.2.1
- django - 在views.py Django中使用返回相关字段
- string - 在 PLSQL 中的另一个字符串中查找一个字符串
- python - pyqt, qt 设计师 .show(); 无法弄清楚如何显示我的 gui
- python-3.x - 正则表达式与“OR”条件下的两个子字符串匹配
- asp.net-mvc-5 - ASP.NET MVC 中的存储过程