簡體   English   中英

SQL連接匯總數據

[英]SQL join with aggregated data

我有兩個SQL表。

USERS

ID   |  USERNAME
001  |  Tom 
002  |  Jane
003  |  Peter
004  |  Mariah

產品

ID   |   PR_NAME   |  USERID
01   |   Apple     |   002
02   |   Pear      |   001
03   |   Tomato    |   002
04   |   Apple     |   003
05   |   Tomato    |   001
06   |   Apple     |   001

如果我在表格/列表/應用程序中選擇“ Apple”,我想查看誰購買了“ Apple”以及這些人購買了多少產品:

USERID | USERNAME | NUM_PRODUCTS_BOUGHT
001    |  Tom     |          3
002    |  Jane    |          2
003    |  Peter   |          1

我試過的是

SELECT 
   USERS.ID, USERS.USERNAME, 
   COUNT(PRODUCTS.PR_NAME) AS NUM_PRODUCTS_BOUGHT 
FROM 
   USERS 
LEFT JOIN 
   PRODUCTS ON PRODUCTS.USERID = USERS.ID 
WHERE 
   PRODUCTS.PR_NAME = "Apple" 
GROUP BY 
   USERS.ID

但是它給了我NUM_ALL(1)這樣的錯誤數字,例如

ID     | USERNAME | NUM_PRODUCTS_BOUGHT
001    |  Tom     |          1
002    |  Jane    |          1
003    |  Peter   |          1

我可以通過3種方式獲得此結果,但無法獲得想要的結果。

我認為您應該嘗試使用Have子句。 我沒有測試過,但是應該可以工作:

SELECT 
   USERS.ID, USERS.USERNAME, 
   COUNT(PRODUCTS.PR_NAME) AS NUM_PRODUCTS_BOUGHT 
FROM 
   USERS 
LEFT JOIN 
   PRODUCTS ON PRODUCTS.USERID = USERS.ID 
GROUP BY 
   USERS.ID
HAVING 
   SUM(CASE WHEN PRODUCTS.PR_NAME = "Apple" THEN 1 ELSE 0 END) > 0

如果問題是缺少“ Mariah”,這是因為where子句撤消了left outer join 將條件移到on子句:

SELECT u.ID, u.USERNAME, COUNT(p.PR_NAME) AS NUM_PRODUCTS_BOUGHT 
FROM USERS u LEFT JOIN 
     PRODUCTS p
     ON p.USERID = u.ID AND
        p.PR_NAME = 'Apple'
GROUP BY u.ID;

注意:在某些數據庫中,您需要在group by子句中包含u.USERNAME 但是,假設USERS.ID是唯一的,則此用法與ANSI標准一致。

您可以分層考慮...

首先,你有一個產品

--q1
select * from PRODUCTS where PR_NAME = "Apple"

然后,您想知道帶來該產品的用戶

--q2
select * from users where
id in (
--q1
select USERID from PRODUCTS where PR_NAME = "Apple"
)

現在,對於用戶而言,您想知道他/她購買了多少產品

--q3
select userid, count(id) cnt from PRODUCT group by userid

最后,您想合並q2和q3的輸出:

select u.id, u.USERNAME, cnt.cnt from users u inner join 
(    --q3
select userid, count(id) cnt from PRODUCT  group by userid
) cnt on u.ID = cnt.userid
where
u.id in (
--q1
select USERID from PRODUCTS where PR_NAME = "Apple"
)

優化:

select u.id, u.USERNAME, cnt.cnt from users u inner join 
(    --q3
select userid, count(id) cnt from PRODUCT  group by userid
) cnt on u.ID = cnt.userid
inner join product p on u.id = p.userid
where
p.pr_name = 'Apple'

嘗試這個:

SELECT U.ID, U.USERNAME, COUNT(P2.PR_NAME) NUM_PRODUCTS_BOUGHT
FROM USERS U
  JOIN PRODUCTS P1
    ON U.ID = P1.USERID
  JOIN PRODUCTS P2
    ON P1.USERID = P2.USERID
WHERE P1.PR_NAME = 'Apple'
GROUP BY U.ID, U.USERNAME

這是用於SQL Server的SQL FIDDLE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM