[英]SQL - 2 SQL parts into 1
您好,我有這兩個指標到目前為止效果很好:
-- --------------------------------------------
-- Nb Unique Accounts
-- -------------------------------------------
select count(distinct(O.user_id))
from DB.order O LEFT JOIN DB.orderCompleted OrC
ON O.id = OrC.order_id
where reason in ('2')
-- --------------------------------------------
-- Nb Accounts that are eighter deactivated or invalid
-- -------------------------------------------
select count(distinct(O.user_id))
from DB.order O JOIN DB.orderCompleted OrC
ON O.id = OrC.order_id
where reason (0,1)
問題#1:我們現在需要第三個度量標准,該度量標准將計算已被禁用或無效的帳戶的nb百分比。 我們怎么能做到呢?
問題2:我們還希望僅使用1個大SQL執行上面的所有3個小查詢,然后再將此聯合的或聯接的大sql使用到商業智能報告工具中,該工具允許使用sql編碼以便將其顯示在交叉表
嘗試這個:
SELECT
count(distinct CASE WHEN reason = 2 THEN O.user_id ELSE NULL END) AS "Nb Unique Accounts",
count(distinct CASE WHEN OrC.Oder_id IS NOT NULL AND reason in (1,2) THEN O.user_id ELSE NULL END) AS "Nb Accounts deactivated/invalid",
count(distinct CASE WHEN OrC.Oder_id IS NOT NULL AND reason in (1,2) THEN O.user_id ELSE NULL END) / count(distinct O.user_id) As "Percent deactived/invalid"
FROM DB.order O
LEFT JOIN DB.orderCompleted OrC ON O.id = OrC.order_id
在
select count(distinct(O.user_id))
from DB.order O LEFT JOIN DB.orderCompleted OrC
ON O.id = OrC.order_id
where O.reason in ('2')
無論用戶ID是否具有相關的orderCompleted
記錄,您都從表order
計算用戶ID。 您可以將其簡化為:
select count(distinct user_id)
from DB.order
where reason = 2;
在查詢中
select count(distinct(O.user_id))
from DB.order O JOIN DB.orderCompleted OrC
ON O.id = OrC.order_id
where reason (0,1)
您要匹配orderCompleted
。 您可以簡單地將其替換為:
select count(distinct user_id)
from DB.order
where reason in (0, 1)
and id in (select order_id from ordercompleted);
要獲得兩個計數,請使用條件聚合。 您還可以進行數學運算:
select
count(distinct case when reason = 2 then user_id end),
count(distinct case when reason in (0, 1) and id in (select order_id from ordercompleted) then user_id end),
count(distinct case when reason in (0, 1) and id in (select order_id from ordercompleted) then user_id end) /
count(distinct user_id)
from DB.order
where reason in (0, 1, 2);
或將子查詢移至FROM
子句:
select
count(distinct case when o.reason = 2 then o.user_id end),
count(distinct case when o.reason in (0, 1) and oc.id is not null then o.user_id end),
count(distinct case when o.reason in (0, 1) and oc.id is not null then o.user_id end) /
count(distinct user_id)
from DB.order o
left join (select distinct order_id from ordercompleted) oc using (order_id)
where o.reason in (0, 1, 2);
在這個偉大的論壇上向大家問好。
請參閱rhis post消息結尾處的內容,以獲取我希望僅在1個大查詢中獲得的正確MySql代碼段。
另外,我之所以做“左聯接”的原因是因為Order O表中的數據可能沒有OrderCompleted OrC表中的相應數據。
@HLGEM:您的意思是
SELECT (col1/col2) AS Percent...
From ( Select col1, col2 from ...)
Where ...
-Nb唯一帳戶
select count(distinct(O.user_id))
from DB.order O LEFT JOIN DB.orderCompleted OrC ON O.id = OrC.order_id where O.reason in (2)
-已取消激活或無效的Nb帳戶
select count(distinct(O.user_id))
from DB.order O JOIN DB.orderCompleted OrC ON O.id = OrC.order_id
where O.reason in (0,1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.