问题描述
我有这个MySQL查询,它统计点击和提交。然后,我想算出提交的点击数之比。以下查询提供了我想要的信息:
SELECT
clicks.review_id,COUNT(clicks.id) as clicks,COUNT(submissions.id) as submissions,ROUND((((COUNT(submissions.id))/(COUNT(clicks.id)))*100),1) as rate,submissions / clicks as other
FROM submissions
RIGHT JOIN clicks ON clicks.id = submissions.click_id
GROUP BY clicks.review_id
ORDER BY rate DESC
结果:
review_id,clicks,submissions,rate
5,429,314,73.2
etc
有没有办法在下一行中使用“点击次数”和“提交内容”的别名,而不用再次进行计数?像这样:
ROUND(((submissions/clicks)*100),
解决方法
如前所述,您可以使用子查询,例如:
printf("≠ is encoded as");
for (size_t i = 0; i < sizeof("≠") - 1; i++) {
printf(" %02hhX","≠"[i]);
}
printf(" and '≠' has a value of 0x%X\n",'≠');
,
为了重用您正在计算的列,您需要生成一个“表表达式”,其中那些新列有效。然后,主查询可以直接使用它们。
例如:
select
*,round(((submissions / clicks) * 100),1) as rate,submissions / clicks as other
from (
select
c.review_id,count(c.id) as clicks,count(s.id) as submissions
from submissions s
right join clicks c on c.id = s.click_id
group by c.review_id
) x
order by rate desc
您可以看到计算的列clicks
和submissions
由内部的“表表达式” x
生成,因此主查询可以访问它们。
您不能在同一子句中重复使用rownames <- c("multifarmacias descuento","multifarmacias","multifarmacias")
子句中定义的别名-您需要一个子查询或公用表表达式,如其他答案所示。
但是总的来说,您可以通过如下重写查询来大大简化查询的逻辑:
select
查询使用select
c.review_id,count(*) as clicks,count(s.id) as submissions,round(avg(s.id is not null) * 100,1) as rate
from clicks c
left join submissions s on s.click_id = c.idd
group by c.review_id
order by rate desc
获取所有点击,并尝试匹配提交。 left join
为您提供了点击次数,而count(*)
仅计算了匹配的提交。然后,count(s.id)
可以方便地计算比率:转换率实际上是avg()
的平均匹配比率。