【问题标题】:Using SQL Aliases in following fields that perform arithmetic在以下执行算术的字段中使用 SQL 别名
【发布时间】:2020-08-17 19:30:00
【问题描述】:

我有一个计算点击和提交的 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

有没有办法可以在下一行中使用“clicks”和“submissions”的别名,而不是再次进行计数?比如:

ROUND(((submissions/clicks)*100),1) as rate,

【问题讨论】:

  • 不,但是您可以使用子查询,这样您就不必输入两次

标签: mysql sql group-by count left-join


【解决方案1】:

如前所述,您可以使用子查询,例如:

SELECT
clicks,submissions,
ROUND(((submissions/clicks)*100),1) as rate
FROM(SELECT
clicks.review_id,
COUNT(clicks.id) as clicks,
COUNT(submissions.id) as submissions
FROM submissions
RIGHT JOIN clicks ON clicks.id = submissions.click_id
GROUP BY clicks.review_id
ORDER BY rate DESC) inr

【讨论】:

    【解决方案2】:

    为了重用您正在动态计算的列,您需要生成一个“表表达式”,这些新列存在。然后,主查询可以直接使用它们。

    例如:

    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 生成的,因此主查询可以访问它们。

    【讨论】:

      【解决方案3】:

      您不能在同一子句中重用 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() 可以方便地计算比率:转化率实际上是left join 的平均匹配率。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 2018-01-17
        相关资源
        最近更新 更多