[英]Redshift - SQL Left Join does not work with correlated subquery and aggregated function
[英]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.