SQL如何按title分组统计单列URL各值计数并横向展示
问题原因
你编写的SQL无法得到预期结果,核心存在两个错误:
- 分组维度错误:需求要求每个title(发言人)单独占一行,但你在
GROUP BY中加入了url字段,会将每个「title+url」的组合拆分为独立行,无法实现单行展示所有URL计数的效果。 - SELECT字段不符合聚合规则:你在查询中加入了
id、page_url、created_at这类单条点击记录独有的明细字段,这类字段既不参与分组,也没有做聚合计算,要么会触发SQL语法报错,要么会返回随机的无效值,和按发言人维度统计的需求冲突。
正确SQL写法
如果只需要按发言人维度统计各URL的点击计数,使用如下代码即可:
SELECT title AS "Speaker Name", COUNT(CASE WHEN url='Apple' THEN 1 END) AS Apple, COUNT(CASE WHEN url='Google (online)' THEN 1 END) AS Google, COUNT(CASE WHEN url='Yahoo (online)' THEN 1 END) AS Yahoo, COUNT(CASE WHEN url='Office 365 (online)' THEN 1 END) AS `Office 365`, COUNT(CASE WHEN url='Outlook' THEN 1 END) AS Outlook, COUNT(CASE WHEN url='Outlook.com (online)' THEN 1 END) AS `Outlook.com (online)` FROM vepdb.click_tracking WHERE app_id=10000076 GROUP BY title;
补充说明
- 如果你需要同时展示和发言人一一绑定的固定属性(比如和title一一对应的
user_id),可以将这类字段同时加入SELECT和GROUP BY子句,示例如下:
SELECT user_id AS "User Id", title AS "Speaker Name", COUNT(CASE WHEN url='Apple' THEN 1 END) AS Apple, COUNT(CASE WHEN url='Google (online)' THEN 1 END) AS Google, COUNT(CASE WHEN url='Yahoo (online)' THEN 1 END) AS Yahoo, COUNT(CASE WHEN url='Office 365 (online)' THEN 1 END) AS `Office 365`, COUNT(CASE WHEN url='Outlook' THEN 1 END) AS Outlook, COUNT(CASE WHEN url='Outlook.com (online)' THEN 1 END) AS `Outlook.com (online)` FROM vepdb.click_tracking WHERE app_id=10000076 GROUP BY user_id, title;
- 不要将
id、page_url、created_at这类单条点击行为独有的明细字段加入查询,这类字段会拆分聚合粒度,导致输出结果不符合预期。 - 带空格、特殊字符的列别名建议用反引号(`)包裹,不要使用单引号,避免不同数据库的语法兼容问题。
内容的提问来源于stack exchange,提问作者Muhammad Irshad
相关产品推荐
相关产品推荐

