2017-10-21 49 views
0

J'ai 2 tablesImpossible de sélectionner la ligne supérieure de la sql colonne de select imbriquée

Produits

PID NAME    ORIGINAL_PRICE DISCNT_RATE 
---- -----------   -------------- ----------- 
p001 stapler      9.99   .1 
p002 TV       249   .15 
p003 camera      148   .2 

Achats

PUR# EID PID CID   QTY PTIME  TOTAL_PRICE 
------ --- ---- ---- ---------- --------- ----------- 
100001 e01 p002 c001   1 12-AUG-17  211.65 
100002 e01 p003 c001   1 20-SEP-17  118.4 
100003 e02 p004 c002   5 08-OCT-17  4.95 
100005 e04 p007 c004   1 15-OCT-17  119.2 
100006 e03 p008 c001   1 12-OCT-17  349.3 

trouver le pid et le nom de chaque produit qui a été vendu le plus en termes de quantité totale. Afficher la quantité totale correspondante (en-tête: "quantité totale vendue"). Utilisez le format de colonne pour remplacer l'en-tête par "quantité totale vendue".

Sol:

Ce que je l'ai fait jusqu'à présent est

SELECT Max("Total") AS "HS", pid 
from (Select pid, sum(qty) as "Total" 
from purchases group by pid); 

Je ne suis pas en mesure de traiter l'information comme prévu si aucune aide ne peut être fournir ..

PS: Ce ne est pas un devoir

+0

Pouvez-vous partager SQL que vous utilisez pour générer les données? –

Répondre

0

Vous pouvez utiliser Sum et grouper par pour obtenir la valeur totale et TOP 1 sur le résultat ordonné pour obtenir le maximum

dans SQL Server

select TOP 1 a.PID, sum(b.QTY) as "total quantity sold" 
    FROM Products AS a 
    INNER JOIN Purchases AS b on a.PID = b.PID 
    GROUP BY a.pID 
    ORDER BY sum(b.QTY) DESC 

Utilisation du maximum de la sous-sélection que vous avez fait (ne pas utiliser le groupe pour obtenir par une ligne seulement) .. peut produire un résultat erroné, car dans la plupart des db ce n'est pas autorisé ou peut montrer un PID obtenu par hasard pour le jeu de résultats du sous-select ..

Si vous ne voulez pas utiliser le TOP (limite pour la ligne), vous devez utiliser la valeur maximale pour filtrer l'esprit où la sous-sélection et obtenir le couple correct PID, MAX tital

0

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 | 
+0

Votre question est-elle résolue maintenant? Avez-vous encore des questions sur cette réponse? Pour accepter et répondre "[** Cliquez sur la coche **] (https://ibb.co/ikqyO6)" pour plus d'informations, consultez la section [aide/acceptation] (https://stackoverflow.com/help/someone-answers). –