繁体   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