2013-10-05 54 views
2

我無法通過子查詢創建查詢來查找我的數據庫中購買次數最多的一位客戶。我需要列出他/她的全名,產品名稱,價格和數量。以下是我迄今爲止子查詢「查找購買量最高的客戶」

select first_name ||' '|| last_name "FullName", pt.name p.price, sum(ps.quantity) 
from customers c 
join purchases ps on c.customer_id = ps.customer_id 
join products p on p.product_id = ps.product_id 
join product_types pt on p.product_type_id = pt.product_type_id; 

我需要使用這三個表

客戶表

Customer_ID 
First_Name 
Last_Name 
DOB 
Phone 

採購表

Product_ID 
Customer_ID 
Quantity 

個產品表

Product_ID 
Product_Type_ID 
Name 
Description 
Price 

產品類型表

Product_Type_ID 
Name 

我很困惑,我應該在哪裏放置子查詢(在選擇行中,從具有或where子句),如果算術函數應該放在選擇的外部查詢或子查詢中。我知道有嵌套子查詢,相關子查詢,多列子查詢,多行子查詢,單行子查詢。順便說一句,我正在嘗試在Oracle中這樣做。 下面是我的結果圖像,但我從數量列中刪除了總和。此外,更新的鏈接。

http://i1294.photobucket.com/albums/b618/uRsh3RRaYm0nD/Capture100_zps1f951b07.jpg

對不起,我忘了,包括第四個表,你可以看到有兩個名稱列在產品表和產品類型的表。區別在於產品表中的「名稱」是產品的具體名稱,如我的鏈接所示。產品類型「名稱」列是產品的更一般名稱,例如書籍,dvd,cds等。我需要在產品類型「名稱列」中包含我的查詢而不是產品名稱列,因此最終結果應該是像這樣

FullName ProductTypeName Price  Quantity  
John Brown Book   Sumof4books 4 
John Brown DVD   Sumof2DVDs 2 
John Brown Magazine  Sumof1Mag  1 
+1

你需要更具體。添加一些測試數據和預期的答案。您是否在爲每個購買了該產品最多的產品尋找一位客戶?無論產品如何,購買量最高的單一客戶?別的東西? – Laurence

回答

1

下面是做到這一點的方法之一。它採用的解析函數由訂購客戶購買總量:row_number() over (order by sum(quantity) desc)。如果有多個人數量相同,則只能挑出一個。

然後,它獲取此客戶ID並以明顯的方式加入其餘表格,以明顯的方式加入按產品類型細分的表格。

Select 
    c.FullName, 
    pt.name, 
    Sum(p.price * ps.quantity) price, 
    sum(ps.quantity) quantity 
From (
    Select 
    c.Customer_ID, 
    c.first_name ||' '|| c.last_name FullName, 
    row_number() over (order by Sum(Quantity) desc) r 
    From 
    Purchases ps 
     Inner Join 
    Customers c 
     On ps.Customer_ID = c.Customer_ID 
    Group By 
    c.Customer_ID, 
    c.first_name ||' '|| c.last_name 
) c 
    Inner Join 
    Purchases ps 
    On c.Customer_ID = ps.Customer_ID 
    Inner Join 
    Products p 
    On ps.Product_ID = p.Product_ID 
    Inner Join 
    Product_Types pt 
    On p.Product_Type_ID = pt.Product_Type_ID 
Where 
    c.r = 1 
Group By 
    c.FullName, 
    pt.name 

Example Fiddle

對於第二個問題(顯示誰對每種產品類型的最高數量的客戶,與他們已經花了什麼對產品類型一起)

Select 
    c.FullName, 
    c.name, 
    c.price, 
    c.quantity 
From (
    Select 
    c.first_name ||' '|| c.last_name FullName, 
    pt.name, 
    sum(p.price * ps.quantity) price, 
    sum(ps.quantity) quantity, 
    row_number() over (partition by pt.name order by Sum(Quantity) desc) r 
    From 
    Purchases ps 
     Inner Join 
    Customers c 
     On ps.Customer_ID = c.Customer_ID 
     Inner Join 
    Products p 
     On ps.Product_ID = p.Product_ID 
     Inner Join 
    Product_Types pt 
     On p.Product_Type_ID = pt.Product_Type_ID 
    Group By 
    c.first_name ||' '|| c.last_name, 
    pt.name 
) c 
Where 
    c.r = 1 

Example Fiddle

+0

我收到「線路錯誤:27列:3表或視圖不存在」消息。 –

+0

看第27行,注意我拼錯了表名,修復它。 – Laurence

+0

是的,非常感謝。是否有可能將其他產品類型(DVD,VIDEO等)的最高數量的客戶與當前的書籍結果包括在一起?我想補償您的時間,您的PayPal電子郵件是什麼?謝謝。 –

0

這裏的總體思路是,你能適應它爲你的數據庫表。

select fred, barney, maxwilma 
from bedrock join 
(select max(wilma) maxwilma 
from bedrock 
group by fred) flinstone on wilma = maxwilma 
0
SELECT CLIENT.CLIENTNO, CLIENT.CNAME, SUM(PURCHASE.AMOUNT) AS AMOUNT 
FROM CLIENT 
INNER JOIN PURCHASE 
ON CLIENT.CLIENTNO = PURCHASE.CLIENTNO 
WHERE CLIENT.CLIENTNO IN (
    SELECT CLIENTNO 
    FROM (
     SELECT PURCHASE.CLIENTNO, SUM(PURCHASE.AMOUNT) AS AMOUNT 
     FROM PURCHASE 
     GROUP BY PURCHASE.CLIENTNO 
     ORDER BY AMOUNT DESC 
    ) 
WHERE ROWNUM = 1) 
GROUP BY CLIENT.CLIENTNO, CLIENT.CNAME; 
0
select first_name ||' '|| last_name "FullName",name,quantity from customers,purchases,products where products.product_id = purchases.product_id and purchases.customer_id = customers.customer_id order by quantity; 

這是查詢你想

相關問題