如何在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的任何保留字命名标识符的名称,那么它将生成错误。要绕过此问题,您需要通过反勾选删除标识符的名称。但在这种情况下,您可以保留事件
列的倒勾@沙拉特