mysql划分

yc0p9oo0  于 2021-06-24  发布在  Mysql
关注(0)|答案(4)|浏览(283)

我有一张有5个字段的table
id=这是自动递增字段
form_id=此字段是正在填写的表单
entry\u id=这是条目的标识符
meta_key=这是特定表单字段的标识符
meta\u value=这是在表单字段中输入的值
如果我做了一个:

SELECT SUM(meta_value) FROM tbl WHERE meta_key = 55;

我得到了所有喜欢苹果的人的总数。
如果我做了一个:

SELECT SUM(meta_value) FROM tbl WHERE meta_key = 75;

我得到所有人的总数。
我试图写一个查询,让我知道%的人谁喜欢苹果的本质 ((RESULT of Q1) / (RESULT of Q2)) * 100 到目前为止,我已经研究了自连接和子查询,但我现在基本上被卡住了,因为所有关于子查询的教程都集中在 WHERE 条款。

vd2z7a6w

vd2z7a6w1#

为了避免被零除,我只建议:

SELECT (SUM(CASE WHEN meta_key = 55 THEN meta_value ELSE 0 END) / 
        SUM(CASE WHEN meta_key = 75 THEN meta_value END)
       ) * 100 
FROM tbl 
WHERE meta_key IN (55, 75);

注意,第二个 CASE 没有 ELSE . 如果没有匹配项,则返回 NULL ,避免被零除。
也就是说,mysql不会返回被零除的错误。它只是返回 NULL . 但这是高度特定于数据库的行为。我认为其他数据库都会返回一个错误,您应该意识到这些潜在的问题。

ycl3bljg

ycl3bljg2#

我能想到的最简单的事情是:

SELECT
    (SELECT SUM(meta_value) FROM tbl WHERE meta_key = 55) /
    (SELECT SUM(meta_value) FROM tbl WHERE meta_key = 75) * 100
    as percentage;

那对你有用吗?

vlurs2pr

vlurs2pr3#

你可以试试这个查询,它可以避免 division by zero ,以防万一 total = 0 .

SELECT
    CASE
        WHEN b.sum_b IS NULL OR b.sum_b = 0 THEN 0
        ELSE (a.sum_a / b.sum_b) * 100
    END as percent

FROM (
    SELECT SUM(meta_value) as sum_a FROM tbl WHERE meta_key = 55
) a,

(
    SELECT SUM(meta_value) as sum_b FROM tbl WHERE meta_key = 75
) b
3z6pesqy

3z6pesqy4#

可以使用条件聚合

SELECT (SUM(CASE WHEN meta_key = 55 THEN meta_value ELSE 0 END) / 
        SUM(CASE WHEN meta_key = 75 THEN meta_value ELSE 0 END)) * 100 -- be careful you may got divide by zero error
FROM tbl 
WHERE meta_key IN (55, 75);

但是,这将产生整数除法结果。所以,你可以包括 1.0 在除法之前,如果你想要精确的结果。

相关问题