【问题标题】:Get a column total and a GROUP BY total获取列总计和 GROUP BY 总计
【发布时间】:2013-03-21 20:54:23
【问题描述】:

在 SQL 中,我想获取来自每个用户的网站点击百分比。为此,我需要获取列 site hits 的总和,但我的查询在另一列上使用了 GROUP By。

除了 GROUP BY 中的每个 user_id 之外,我如何获得整个列的总和?

数据集:

User    Page Hits    Page
----    ---------    ----
a       10           home
a       10           profile
b       8            home
b       2            profile
c       6            home
c       4            profile

结果:

User     Site Hits      pct of total site hits
----     ---------      ---------------
a        20             50%
b        10             25%
c        10             25%

查询:

SELECT
user,
SUM(page_hits) AS site_hits,
SUM(page_hits) / total_page_hits <-- How do I get sum of 'page hits' for total_page_hits ????
FROM hit_data
GROUP BY user

【问题讨论】:

    标签: mysql sql join group-by aggregate-functions


    【解决方案1】:

    一个选项:使用子查询。

    SELECT
    user,
    SUM(page_hits) AS site_hits,
    SUM(page_hits) / (select sum(page_hits) from hit_data) 
    FROM hit_data
    GROUP BY user
    

    【讨论】:

    • 你能按照你展示的方式使用子查询吗?我认为子查询必须是 FROM 或 JOIN 语句的一部分?
    • 是的,这是我提到的正确方法。子查询可以在 JOIN/WHERE 或 SELECT 中作为列使用。
    • 不,它几乎可以用于在查询中的任何位置返回标量。
    • 这比在 FROM 或 JOIN 子句中效率低吗?
    • 不,它非常有效。优化器将只运行该子查询一次,然后将该值用于所有其余数据。性能将与将该值加入主查询相同。
    【解决方案2】:

    除非您在子查询中选择总命中数作为子查询中的一列,否则您需要将其作为两个查询来执行。

    【讨论】:

    • JOIN 的问题是你在 group by 之前增加了行数,然后页面点击的总数就会受到影响。
    【解决方案3】:

    这可能有效,而且比看起来更合理:

    SELECT user, SUM(page_hits) AS site_hits,
           SUM(page_hits) / (select sum(page_hits) from hit_data)
    FROM hit_data
    GROUP BY user
    

    由于子查询与记录不相关,数据库引擎可以先运行子查询,然后在外部查询中将其用作常量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多