查找表中的最高和最低销售项目

时间:2015-12-22 14:17:46

标签: oracle oracle11g

我有两张表如下 -

ORDERS

  create table orders (
  ono      number(5) not null primary key,
  cno      number(5) references customers,
  eno      number(4) references employees,
  received date,
  shipped  date);

ODETAILS

create table odetails (
  ono      number(5) not null references orders,
  pno      number(5) not null references parts,
  qty      integer check(qty > 0),
  primary key (ono,pno));

ODETAILS表

enter image description here

现在我正在努力找出销量最高和最低的产品。具有最高PNO 10601为4的逻辑QTY是销量最高的产品。以下查询返回最畅销的产品。

SELECT PNO FROM 
(SELECT od.PNO, SUM(od.QTY) AS TOTAL_QTY
FROM ODETAILS od 
GROUP BY od.PNO 
ORDER BY SUM(od.QTY) DESC)
WHERE ROWNUM =1

--Thanks to Bob Jarvis

如何在上面的SQL中添加DATE WHERE子句,以便找出给定月份中销量最高的产品(比如说12月)?我所指的DATE来自ORDERS表和RECEIVED属性。我想我首先需要加入表格

4 个答案:

答案 0 :(得分:1)

... where received between to_date('12/01/2015','MM/DD/YYYY') and to_date('12/31/2015','MM/DD/YYYY')

答案 1 :(得分:1)

我相信我已经解决了!

SELECT PNO  
FROM (SELECT OD.PNO, SUM(OD.QTY) AS TOTAL_QTY 
      FROM ODETAILS OD INNER JOIN ORDERS ON OD.ONO = ORDERS.ONO
      WHERE EXTRACT(MONTH FROM ORDERS.RECEIVED) = &MONTH_NUMBER 
      GROUP BY OD.PNO 
      ORDER BY SUM(OD.QTY) DESC)
WHERE ROWNUM =1;

答案 2 :(得分:1)

您可以在日期列上为查询添加一些to_char次调用以解析年份和月份,或者只需要按月将所有年份除以月份(月份和年份似乎更有用),然后添加到你的where子句。请参阅我自包含的示例:

with odetails as
(
   select 1 as ono, 1 as pno, 4 as qty from dual
   union all
   select 1 as ono, 2 as pno, 1 as qty from dual
   union all
   select 1 as ono, 3 as pno, 2 as qty from dual
   union all
   select 1 as ono, 4 as pno, 1 as qty from dual
   union all
   select 2 as ono, 2 as pno, 1 as qty from dual
   union all
   select 2 as ono, 3 as pno, 2 as qty from dual
),
orders as
(
    select 1 as ono, 1 as cno, 1 as eno, to_date('2015-10-12', 'YYYY-MM-DD') as received, to_date('2015-10-15', 'YYYY-MM-DD') as shipped from dual
    union all 
    select 2 as ono, 1 as cno, 1 as eno, to_date('2015-11-12', 'YYYY-MM-DD') as received, to_date('2015-11-15', 'YYYY-MM-DD') as shipped from dual
)
select pno
from
(
   select od.pno, Sum(od.qty) as total_qty,  to_char(received, 'YYYY-MM') as year_month
   from odetails od
   join orders o 
   on o.ono = od.ono
   group by od.pno, to_char(received, 'YYYY-MM')
   order by Sum(od.qty) desc
)
where rownum = 1
and year_month = '2015-11'
;

这使您的PNO为3,因为它在2015年11月的数量最多。

答案 3 :(得分:1)

SQL Fiddle

Oracle 11g R2架构设置

create table orders (
  ono      number(5) not null primary key,
  cno      number(5),
  eno      number(4),
  received date,
  shipped  date
);

INSERT INTO orders
SELECT 1020, 1, 1, DATE '2015-12-21', NULL FROM DUAL UNION ALL
SELECT 1021, 1, 1, DATE '2015-12-20', DATE '2015-12-20' FROM DUAL UNION ALL
SELECT 1022, 1, 1, DATE '2015-12-18', DATE '2015-12-20' FROM DUAL UNION ALL
SELECT 1023, 1, 1, DATE '2015-12-21', NULL FROM DUAL UNION ALL
SELECT 1024, 1, 1, DATE '2015-12-20', DATE '2015-12-20' FROM DUAL;

create table odetails (
  ono      number(5) not null references orders(ono),
  pno      number(5) not null,
  qty      integer check(qty > 0),
  primary key (ono,pno)
);

INSERT INTO odetails
SELECT 1020, 10506, 1 FROM DUAL UNION ALL
SELECT 1020, 10507, 1 FROM DUAL UNION ALL
SELECT 1020, 10508, 2 FROM DUAL UNION ALL
SELECT 1020, 10509, 3 FROM DUAL UNION ALL
SELECT 1021, 10601, 4 FROM DUAL UNION ALL
SELECT 1022, 10601, 1 FROM DUAL UNION ALL
SELECT 1022, 10701, 1 FROM DUAL UNION ALL
SELECT 1023, 10800, 1 FROM DUAL UNION ALL
SELECT 1024, 10900, 1 FROM DUAL;

查询1 - 2015年12月已售出最高总数量的ono的{​​{1}}和pno

pno

更改SELECT ono, pno, TOTAL_QTY FROM ( SELECT q.*, RANK() OVER ( ORDER BY TOTAL_QTY DESC ) AS rnk FROM ( SELECT od.ono, od.PNO, SUM( od.QTY ) OVER ( PARTITION BY od.PNO ) AS TOTAL_QTY FROM ODETAILS od INNER JOIN orders o ON ( o.ono = od.ono ) WHERE TRUNC( o.received, 'MM' ) = DATE '2015-12-01' -- WHERE EXTRACT( MONTH FROM o.received ) = 12 ) q ) WHERE rnk = 1 条款以获取任何12月而非2015年12月的结果。

<强> Results

WHERE

查询2 - 2015年12月在单个订单中销售了最大数量的商品的| ONO | PNO | TOTAL_QTY | |------|-------|-----------| | 1021 | 10601 | 5 | | 1022 | 10601 | 5 | ono

pno

更改SELECT ono, pno, qty FROM ( SELECT od.*, RANK() OVER ( ORDER BY od.qty DESC ) AS qty_rank FROM ODETAILS od INNER JOIN orders o ON ( o.ono = od.ono ) WHERE TRUNC( o.received, 'MM' ) = DATE '2015-12-01' -- WHERE EXTRACT( MONTH FROM o.received ) = 12 ) WHERE qty_rank = 1 条款以获取任何12月而非2015年12月的结果。

<强> Results

WHERE