[英]How to: SELECT from multiple CTEs that are mutually exclusive
我處於一種情況,我需要根據用戶進行的推薦顯示用戶的統計信息,然后顯示有關這些被推薦用戶活動的統計信息。 因此,如果用戶 A 引用用戶 B,C 則表示用戶 A 引用了 2 個用戶。 現在,我需要知道有多少referred
的用戶確實采取了行動,即購買。 但是他們可能不會購買計數為 0 的東西。我使用 CTE 進行了以下查詢,它確實按預期工作,但它也返回了一些假陰性結果。 IE
WITH direct_referrals AS (
SELECT id
FROM "user"
WHERE "user"."referredBy" = ${userId}
),
application_stats AS (
SELECT count(status), status
FROM "application"
WHERE "userId" IN (SELECT id FROM direct_referrals)
GROUP BY status
)
SELECT *, (SELECT count(id) FROM direct_referrals) AS "totalReferrals"
FROM application_stats;
如果至少有 1 個被推薦的用戶采取了一些操作,則此查詢返回正確的結果,但當沒有人采取任何操作時它會失敗,在這種情況下,此查詢將referred
的用戶返回為 0,這是不正確的。
我可以看到SELECT
依賴於application_stats
CTE,它可能不會返回任何結果,因此也不會返回direct_referrals
。 我對 SQL 有點陌生,所以真的不知道很多選擇。 任何幫助表示贊賞。
謝謝
更新樣本數據和預期結果
// 用戶 model
Id username referredBy
---- -------- -------------------
1 jon NULL
2 jane 1
3 doe 1
4 smith 2
5 john 1
// 應用 model
Id userId status
---- -------- -------------------
1 12 'APPLIED'
2 13 'APPLIED'
3 14 'VIEWED'
預期結果(對於 userId = 1):
User (referral) stats Application stats
------------------- -------------------
3 0
實際結果:
User (referral) stats Application stats
------------------- -------------------
0 0
像這樣的東西應該給你你想要的:
WITH REFERRAL AS (
SELECT REFERREDBY, COUNT(USERNAME) AS "REF_CNT"
FROM USER_MODEL
WHERE REFERREDBY IS NOT NULL
GROUP BY REFERREDBY
),
APPLICATIONS AS (
SELECT UM.REFERREDBY, COUNT(ML.APPL_STATUS) AS "APPL_CNT"
FROM USER_MODEL UM
LEFT OUTER JOIN APPLICATION_MODEL ML ON UM.ID = ML.USER_ID AND ML.APPL_STATUS = 'PURCHASED'
GROUP BY UM.REFERREDBY
)
SELECT R.REFERREDBY, R.REF_CNT, A.APPL_CNT
FROM REFERRAL R
LEFT OUTER JOIN APPLICATIONS A ON R.REFERREDBY = A.REFERREDBY;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.