分析函数SQL

时间:2014-07-20 11:58:12

标签: sql database oracle

对于每件事,表CUSTOMERS的顺序显示客户的名称(公司名称),以及以下三列 - 最小值,最大值和平均值 具有折扣的该客户的订单价值(表ORDERS和ORDERDETAILS的数据) 注意:假设请求只包含一个单词SELECT。
数据库方案:
enter image description here

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

此查询查找最小,最大和平均成本不是整个订单,而只是订单(在一个订单中可能是多个订单)。

1 个答案:

答案 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

我永远不会写这样的查询。双嵌套聚合更清晰,可能具有更好的性能。但有趣的是(以一种不正常的方式)可以做到这一点。