如何在MySQL中分割一列中的值并将结果存储在另一列中

如何在MySQL中分割一列中的值并将结果存储在另一列中,mysql,sql,Mysql,Sql,我有一个名为“警报”的表,看起来像这样 user_id event alert_type 1 imp s 2 imp b 3 imp b 3 clk b 6 imp b 9 imp s 9 clk s 2 clk b 6 clk b 17 imp p 18

我有一个名为“警报”的表,看起来像这样

user_id event   alert_type
1       imp       s
2       imp       b
3       imp       b
3       clk       b
6       imp       b
9       imp       s
9       clk       s
2       clk       b
6       clk       b
17      imp       p
18      imp       p
19      imp       s
11      imp       b
14      imp       s
1       clk       s
11      clk       b
15      imp       p
15      clk       p
20      imp       b
21      imp       b
22      imp       p
23      imp       s
24      imp       s
23      clk       s
18      clk       p
29      imp       b
29      clk       b
16      imp       p
16      clk       p
27      imp       s
28      imp       s
我正在尝试为每个警报类型创建一个名为result的新列,其中
result=clk/imp

我期望的输出是

alert_type  result
b           0.7143
p           0.6
s           0.375
我试图这样做,但我知道这是非常低效的

select 
((select alert_type,count(*) from alerts where alert_type = 'b' and event = 'clk') / 
 (select alert_type,count(*) from alerts where alert_type = 'b' and event = 'imp')) result 
 from dual;

请帮助我以一种简洁的方式实现所需的输出

您可以尝试类似的方法:

SELECT 
alert_type,
(SUM(`event` = 'clk' ) / SUM(`event` = 'imp')) AS result
FROM alerts
WHERE alert_type ='b'
GROUP BY alert_type
注意:

因为
MySQL
布尔表达式解析为
0/1
,所以您可以在您的用例中将其大写

SUM(a=b)仅当a等于b时才返回1


更多:因为我使用了
SUM
而不是
COUNT
,所以您不必担心
被零除的错误

非常感谢你。它很有魅力。我只是好奇为什么第三行的事件栏用引号括起来?我正在尝试学习mysql,所以你们的输入肯定会有帮助。事件列并没有被引用,而是用反勾号括起来(尽管这里不需要)。如果您不小心用mysql的任何保留字命名标识符的名称,那么它将生成错误。要绕过此问题,您需要通过反勾选删除标识符的名称。但在这种情况下,您可以保留
事件
列的倒勾@沙拉特