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