MySQL根据分组查询结果计算比率

时间:2018-10-25 02:50:49

标签: mysql group-by

添加:

SQL查询:

SELECT s.name
     , d.feeling
     , COUNT(1) AS times 
  FROM data_table d
     , staff s 
 WHERE d.nid = s.id 
   AND d.project_id = 1 
   AND d.crawl_time BETWEEN '2018-10-17' AND '2018-10-24' 
   AND LENGTH(TRIM(d.feeling)) > 0 
 GROUP 
    BY d.nid
     , d.feeling

添加(END)

我编写了一个sql,以按名称和感觉查询每个身体的感觉组的时间。这是结果。

-- a certain sql returns, not an existing table --    
`name`  `feeling`   `times`  (expect)
Jack     happy        10       0.45
Jack     sad          7        0.31
Jack     common       5        0.22
Lily     happy        3        0.27
Lily     sad          6        0.54
Lily     common       2        0.18
Sam      happy        6        0.42
Sam      sad          7        0.5
Sam      common       1        0.07

现在的目的是计算每个人的感觉比例。例如,杰克的幸福感占10/(10+7+5)的情感,而悲伤的情感是7/(10+7+5)。 使用SUM(result.count)GROUP BY name进行计算时,无法显示悲伤或普通的感觉。然后,我使用子查询,但该表不存在。反正有没有创建视图的工作吗?

1 个答案:

答案 0 :(得分:1)

一种适用于任何MySQL版本的解决方案使用子查询为每个名称找到times的总和,然后加入该子查询:

SELECT
    t1.name,
    t1.feeling,
    t1.times,
    t1.times / t2.times_sum AS feeling_ratio
FROM yourTable t1
INNER JOIN
(
    SELECT name, SUM(times) AS times_sum
    FROM yourTable
    GROUP BY name
) t2
    ON t1.name = t2.name;

如果您使用的是MySQL 8+或更高版本,并且可以使用分析功能,则可以使用以下更简单的方式编写此代码:

SELECT
    t1.name,
    t1.feeling,
    t1.times,
    t1.times / SUM(t1.times) OVER (PARTITION BY t1.name) AS feeling_ratio
FROM yourTable t1;