对于每件事,表CUSTOMERS的顺序显示客户的名称(公司名称),以及以下三列 - 最小值,最大值和平均值
具有折扣的该客户的订单价值(表ORDERS和ORDERDETAILS的数据)
注意:假设请求只包含一个单词SELECT。
数据库方案:
select distinct c.companyname,
sum(od.unitprice*od.quantity*(1-od.discount)) over (partition by o.orderid) as "SUM"
from customers c, orders o, orderdetails od where c.customerid=o.customerid
and o.orderid=od.orderid
此查询显示订单的总价值。另外还可以找到订单的最小值,最大值和平均值?
select c.companyname,
min(od.unitprice*od.quantity*(1-od.discount)) over (partition by o.customerid) as "MIN",
max(od.unitprice*od.quantity*(1-od.discount)) over (partition by o.customerid) as "MAX",
avg(od.unitprice*od.quantity*(1-od.discount)) over (partition by o.customerid) as "AVG"
from customers c, orders o, orderdetails od
where c.customerid=o.customerid and o.orderid=od.orderid
此查询查找最小,最大和平均成本不是整个订单,而只是订单(在一个订单中可能是多个订单)。
答案 0 :(得分:1)
我想你只想group by
,但两次。一旦达到orders
级别,一次达到customer
级别:
select companyname, min(mino), max(maxo), sum(sumo)
from (select c.companyname, o.orderid,
min(od.unitprice*od.quantity*(1-od.discount)) as mino
max(od.unitprice*od.quantity*(1-od.discount)) as maxo
sum(od.unitprice*od.quantity*(1-od.discount)) as sumo
from customers c join
orders o
on c.customerid = o.customerid join
orderdetails od
on o.orderid = od.orderid
group by c.companyname, o.orderid
) co
group by companyname;
请注意,我还引入了显式join
语法。如果您正在学习SQL,则应使用join
关键字和on
子句学习表达联接的正确方法。
编辑:
一个select
是一个荒谬的限制。假设这是一个过程,更严重的是强加这样的限制,其中不需要现代连接语法。
但是,我认为这是可能的。愚蠢的查询,但仍然可能。
select distinct c.companyname,
min(min(od.unitprice*od.quantity*(1-od.discount))) over (partition by companyname) as mino,
max(max(od.unitprice*od.quantity*(1-od.discount))) over (partition by companyname) as maxo
sum(sum(od.unitprice*od.quantity*(1-od.discount))) over (partition by companyname) as sumo
from customers c join
orders o
on c.customerid = o.customerid join
orderdetails od
on o.orderid = od.orderid
group by c.companyname, o.orderid
我永远不会写这样的查询。双嵌套聚合更清晰,可能具有更好的性能。但有趣的是(以一种不正常的方式)可以做到这一点。