2017-10-21 65 views
0

选择列SQL顶行我有2个表无法从嵌套查询

产品

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

购买

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 

找到已被出售的每个产品的PID和名称就总量而言最多。显示相应的总量(标题:“已售出的总量”)。使用列格式将标题更改为“已售出总量”。

溶胶:

我做了什么至今

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

我无法处理预期如果任何帮助,可以提供的信息..

PS:它不是作业

+0

你能分享你正在使用生成数据的SQL? –

回答

0

您可以使用Sum和group by来获得总计值和TOP 1的订购结果以获取最大值

在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 

使用从子选择最大为你做了..可以产生错误的结果,因为在大多数的分贝,这是不允许的或(不通过获得一排只有使用组)可以显示一个PID的结果集的子查询的随便获得..

,如果你不想使用TOP(限行),你应该使用过滤器机智的最大值合适,其中子查询和获取正确的情侣PID,MAX tital

0

对于销售量最大的产品的pid和名称两者均:

从甲骨文12C上有一个fetch功能,将输出限制在一个行:

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 
; 

对于早期版本的Oracle支持row_number() over()(或具有相同的功能支持其它数据库):

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 
; 

但是,这两种方法都假定只有一行要报告。在一组更大的数据中,可能有多行共享最高数量的总和。要返回所有这些行使用dense_rank() over()代替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 
; 

注意,样品中只要有PID的P004/P007/P008是从产品表中缺少。我认为这只是对这个问题的遗漏。

SQL Fiddle

的Oracle 11g R2架构设置

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 
; 

查询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 | 

查询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

你的问题现在解决了吗?你仍然有关于这个答案的问题吗?接受并回答 “[**点击蜱**](https://ibb.co/ikqyO6)” 的详细看[求助/接收(https://stackoverflow.com/help/someone-answers) –