Pour le pid et le nom du produit qui a vendu le plus grand quant ité:
d'Oracle 12c là-bas est une caractéristique fetch
qui limiterait la sortie à une ligne:
SELECT pu.pid, pr.name, sum(pu.qty) as "total quantity sold"
FROM PURCHASES pu
INNER JOIN PRODUCTS pr on pu.pid = pr.pid
GROUP BY pu.pid, pr.name
ORDER BY sum(pu.qty) DESC
FETCH FIRST 1 ROWS ONLY
;
Pour les versions antérieures d'Oracle supportant row_number() over()
(ou pour d'autres bases de données avec le même support de la fonction):
SELECT pid, name, "total quantity sold"
FROM (
SELECT pu.pid, pr.name, sum(pu.qty) as "total quantity sold"
, ROW_NUMBER() OVER(ORDER BY sum(pu.qty) DESC) AS RN
FROM PURCHASES pu
INNER JOIN PRODUCTS pr on pu.pid = pr.pid
GROUP BY pu.pid, pr.name
)
WHERE RN = 1
;
Mais ces deux approches supposent qu'il n'y a qu'une seule ligne à signaler. Dans un plus grand ensemble de données, il pourrait y avoir plus d'une ligne partageant la somme la plus élevée de la quantité. Pour revenir toutes ces lignes utilisent dense_rank() over()
place e, g ,:
SELECT pid, name, "total quantity sold"
FROM (
SELECT pu.pid, pr.name, sum(pu.qty) as "total quantity sold"
, DENSE_RANK() OVER(ORDER BY sum(pu.qty) DESC) AS RNK
FROM PURCHASES pu
INNER JOIN PRODUCTS pr on pu.pid = pr.pid
GROUP BY pu.pid, pr.name
)
WHERE RNK = 1
;
Note, dans l'échantillon à la condition p004 PIDs/P007/P008 sont absents de la table des produits. Ce que je suppose est juste une omission de la question.
SQL Fiddle
Oracle 11g R2 Configuration du schéma:
CREATE TABLE PURCHASES
(PURno int, EID varchar2(3), PID varchar2(4), CID varchar2(4), QTY int, PTIME timestamp, TOTAL_PRICE numeric)
;
INSERT ALL
INTO PURCHASES (PURno, EID, PID, CID, QTY, PTIME, TOTAL_PRICE)
VALUES (100001, 'e01', 'p002', 'c001', 1, '12-Aug-2017 12:00:00 AM', 211.65)
INTO PURCHASES (PURno, EID, PID, CID, QTY, PTIME, TOTAL_PRICE)
VALUES (100002, 'e01', 'p003', 'c001', 1, '20-Sep-2017 12:00:00 AM', 118.4)
INTO PURCHASES (PURno, EID, PID, CID, QTY, PTIME, TOTAL_PRICE)
VALUES (100003, 'e02', 'p004', 'c002', 5, '08-Oct-2017 12:00:00 AM', 4.95)
INTO PURCHASES (PURno, EID, PID, CID, QTY, PTIME, TOTAL_PRICE)
VALUES (100005, 'e04', 'p007', 'c004', 1, '15-Oct-2017 12:00:00 AM', 119.2)
INTO PURCHASES (PURno, EID, PID, CID, QTY, PTIME, TOTAL_PRICE)
VALUES (100006, 'e03', 'p008', 'c001', 1, '12-Oct-2017 12:00:00 AM', 349.3)
SELECT * FROM dual
;
CREATE TABLE PRODUCTS
(PID varchar2(5), NAME varchar2(70), ORIGINAL_PRICE int, DISCNT_RATE numeric)
;
INSERT ALL
INTO PRODUCTS (PID, NAME, ORIGINAL_PRICE, DISCNT_RATE)
VALUES ('p001', 'stapler', 9.99, .1)
INTO PRODUCTS (PID, NAME, ORIGINAL_PRICE, DISCNT_RATE)
VALUES ('p002', 'TV', 249, .15)
INTO PRODUCTS (PID, NAME, ORIGINAL_PRICE, DISCNT_RATE)
VALUES ('p003', 'camera', 148, .2)
INTO PRODUCTS (PID, NAME, ORIGINAL_PRICE, DISCNT_RATE)
VALUES ('p004', 'p004 missing from sample', 0, 0)
INTO PRODUCTS (PID, NAME, ORIGINAL_PRICE, DISCNT_RATE)
VALUES ('p007', 'p007 missing from sample', 0, 0)
INTO PRODUCTS (PID, NAME, ORIGINAL_PRICE, DISCNT_RATE)
VALUES ('p008', 'p008 missing from sample', 0, 0)
SELECT * FROM dual
;
Query 1:
SELECT PID, NAME, "total quantity sold"
FROM (
SELECT pu.pid, pr.name, sum(pu.qty) as "total quantity sold"
, ROW_NUMBER() OVER(ORDER BY sum(pu.qty) DESC) AS RN
FROM PURCHASES pu
INNER JOIN PRODUCTS pr on pu.pid = pr.pid
GROUP BY pu.pid, pr.name
)
WHERE RN = 1
;
Results:
| PID | NAME | total quantity sold |
|------|--------------------------|---------------------|
| p004 | p004 missing from sample | 5 |
Requête 2:
SELECT PID, NAME, "total quantity sold"
FROM (
SELECT pu.pid, pr.name, sum(pu.qty) as "total quantity sold"
, DENSE_RANK() OVER(ORDER BY sum(pu.qty) DESC) AS RNK
FROM PURCHASES pu
INNER JOIN PRODUCTS pr on pu.pid = pr.pid
GROUP BY pu.pid, pr.name
)
WHERE RNK = 1
;
Results:
| PID | NAME | total quantity sold |
|------|--------------------------|---------------------|
| p004 | p004 missing from sample | 5 |
Pouvez-vous partager SQL que vous utilisez pour générer les données? –