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

aiazj4mn  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(264)

添加:
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

添加(结束)
我编写了一个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 想一想,悲伤或普通的感情是无法表现出来的。然后我使用子查询,但是表不存在。在不创建视图的情况下是否还有其他方法可以工作?

x6492ojm

x6492ojm1#

有一种解决方案应该适用于任何版本的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;

相关问题