在执行算术的以下字段中使用SQL别名

问题描述

我有这个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

您可以看到计算的列clickssubmissions由内部的“表表达式” 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()的平均匹配比率。