具有不同键的相同列的MySQL分区

时间:2018-04-25 06:17:01

标签: mysql sql

我有一个包含5个字段的表

id =这是自动增量字段
form_id =此字段是填写的表格
entry_id =这是条目的标识符
meta_key =这是特定表单字段的标识符
meta_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子句上。

4 个答案:

答案 0 :(得分:1)

您可以使用条件聚合

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

答案 1 :(得分:1)

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

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

这会对你有用吗?

答案 2 :(得分:1)

您可以尝试此查询,避免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

答案 3 :(得分:0)

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

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。但这是高度特定于数据库的行为。我认为每个其他数据库都会返回一个错误,你应该意识到这些潜在的问题。