这是erp.orders:
user_id
1
2
1
1
1
这是prod.referral_order_delivered
SELECT DISTINCT
erp.orders.userid, COUNT(erp.orders.userid) as countorders
FROM
erp.orders
WHERE
erp.orders.userid IN (SELECT erp.orders.userid
FROM erp.orders, prod.referral_order_delivered
WHERE erp.orders.userid = prod.referral_order_delivered.user_id
AND erp.orders.paidat::date >= '2017-06-07'
AND erp.orders.paidat::date <= '2017-07-07')
GROUP BY
erp.orders.userid;
我需要结合两个请求。
此请求:
userId countorders
1 2
2 4
返回此结果:
SELECT
prod.referral_order_delivered.user_id,
COUNT(prod.referral_order_delivered.user_id) AS countreferral
FROM
prod.referral_order_delivered
WHERE
prod.referral_order_delivered.user_id IN (SELECT DISTINCT erp.orders.userid
FROM erp.orders
INNER JOIN prod.referral_order_delivered ON erp.orders.userid = prod.referral_order_delivered.user_id
WHERE erp.orders.paidat >= '2017-06-07'
AND erp.orders.paidat <= '2017-07-07')
GROUP BY
prod.referral_order_delivered.user_id
这个要求:
user_id countreferral
1 4
2 1
返回此结果:
userId countorders countreferral
1 2 4
2 4 1
现在我想结合这些请求来获得这个结果:
{{1}}
请注意,user_id和userId是一回事。因此,如果出现user_id或userId并不重要。
您可以测试解决方案here。
答案 0 :(得分:1)
考虑将两个聚合查询作为派生表加入。首先,将IN
子句查询(两者都与前者使用隐式连接,后者使用显式连接)转换为JOIN
子句。然后,运行相同的聚合,外部查询连接两者并选择列。
SELECT agg1.userid, agg1.countorders, agg2.countreferral
FROM
(SELECT j.userid, COUNT(j.userid) as countorders
FROM
(SELECT DISTINCT erp.orders.userid
FROM erp.orders
INNER JOIN prod.referral_order_delivered
ON erp.orders.userid = prod.referral_order_delivered.user_id
WHERE erp.orders.paidat >= '2017-06-07'
AND erp.orders.paidat <= '2017-07-07') j
INNER JOIN erp.orders e ON j.userid = e.userid
GROUP BY j.userid) agg1
INNER JOIN
(SELECT j.userid, COUNT(j.userid) as countreferral
FROM
(SELECT DISTINCT erp.orders.userid
FROM erp.orders
INNER JOIN prod.referral_order_delivered
ON erp.orders.userid = prod.referral_order_delivered.user_id
WHERE erp.orders.paidat >= '2017-06-07'
AND erp.orders.paidat <= '2017-07-07') j
INNER JOIN prod.referral_order_delivered p ON j.userid = p.user_id
GROUP BY j.userid) agg2
ON agg1.userid = agg2.userid
甚至将两个聚合源中使用的嵌套内部查询保存为view。
SELECT agg1.userid, agg1.countorders, agg2.countreferral
FROM
(SELECT v.userid, COUNT(j.userid) as countorders
FROM myview v
INNER JOIN erp.orders e ON v.userid = e.userid
GROUP BY v.userid) agg1
INNER JOIN
(SELECT v.userid, COUNT(j.userid) as countreferral
FROM myview v
INNER JOIN prod.referral_order_delivered p ON v.userid = p.user_id
GROUP BY v.userid) agg2
ON agg1.userid = agg2.userid
在其他RDBMS中,如Postgres与MySQL不同,您可以使用CTE&#39; WITH()
来避免重复。请参阅初始设置中的rextester demo。