Запросы: чтобы найти название проекта, который использовал максимальное количество частей - PullRequest
0 голосов
/ 08 марта 2019

Я выполняю задание, в котором я создал три таблицы, а именно «Проект», «Деталь» и «Использование». Структура таблиц приведена ниже:

 SQL> CREATE TABLE PROJECT
  2  (
  3  PNO VARCHAR2(5) PRIMARY KEY,
  4  PNAME VARCHAR2(15) NOT NULL,
  5  CITY VARCHAR2(15) NOT NULL
  6  );

SQL> CREATE TABLE PART
  2  (
  3  PID VARCHAR2(5) PRIMARY KEY,
  4  PNAME VARCHAR2(15) NOT NULL,
  5  COLOR VARCHAR2(15) NOT NULL
  6  );

SQL> CREATE TABLE USE
  2  (
  3  PNO VARCHAR2(5),
  4  PID VARCHAR2(5),
  5  QTY NUMBER CHECK(QTY >5 AND QTY<100),
  6  FOREIGN KEY(PNO) REFERENCES PROJECT,
  7  FOREIGN KEY(PID) REFERENCES PART,
  8  PRIMARY KEY(PNO,PID)
  9  );

Я хочу написать запрос, чтобы узнать название проекта, который использовал наибольшее количество продуктов.

Я могу написать следующий запрос, который возвращает количество деталей, используемых каждым проектом.

SQL> SELECT PNO, SUM(QTY)
  2  FROM USE
  3  GROUP BY PNO;

PNO     SUM(QTY)
----- ----------
P4           205
P1            95
P2            95
P3            20

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

попробуйте, как показано ниже

   with cte as (
     SELECT PNO, SUM(QTY) as q
       FROM USE
       GROUP BY PNO
)  select * from cte where cte.q= (select max(q) from cte)
0 голосов
/ 08 марта 2019

Мы можем попытаться использовать RANK здесь, чтобы захватить все связи за первое место:

WITH cte AS (
    SELECT p.PNAME, SUM(u.QTY) AS QTY,
        RANK() OVER (ORDER BY SUM(u.QTY) DESC) rnk
    FROM PROJECT p
    INNER JOIN USE u
        ON p.PNO = u.PNO
    GROUP BY p.PNO, p.PNAME
)

SELECT PNAME, QTY
FROM cte
WHERE rnk = 1
ORDER BY PNAME;
0 голосов
/ 08 марта 2019

вы можете попробовать ниже-

select * from
(
SELECT PNO, SUM(QTY) as totalqty
  FROM USE
  GROUP BY PNO order by SUM(QTY) desc
)A where rownum=1
...