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