簡體   English   中英

SQL-將2個SQL部分合並為1個

[英]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.

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