假设我有这个MySQL表:
id place_id area_mq n
-- -------- ------- --
1 1 50 1
2 2 90 1
3 2 20 1
4 3 10 1
5 3 10 2
6 3 10 3
7 4 20 1
8 4 20 2
9 5 15 1
10 5 25 1
id
是主键,place_id
代表区域ID,area_mq
是mq中地点的表面区域。
我要做的是找到一个紧凑的查询来计算area_mq
与这些规则的总和:
n
的{{1}} 相等,则每place_id
计算一次(area_mq
= 2的f.ex,我算一算90 和 20总和)place_id
n
不同,则只计算<{1}} 一次(可能因为这些一种“地方”的价值将是相同的; f.ex。place_id
= 4,有两个20,我总和只有20而不是40)。在这个例子中,我的正确总数为:50 +(90 + 20)+ 10 + 20 +(15 + 25)。
我可以通过查询(没有代码或程序)完成此操作吗?如果对n的要求被颠倒了,那么使用GROUP BY和子查询会很简单......但是在这些条件下,我被卡住了。
答案 0 :(得分:6)
select place_id, sum(area_sq)/count(distinct n)
from your_table
group by place_id;
经过测试here
答案 1 :(得分:0)
从我在您的模式中看到的内容中添加了n = 1
所有内容?
SELECT SUM((n = 1) * area_mq) AS total
FROM table_name
我做一个返回1或0的验证,然后我将它与列值相乘。
答案 2 :(得分:0)
我认为你可以使用这样的东西。获取总和和 n 的计数,以及 min 和 max (也许是矫枉过正的);用它来确定 n 的所有值是否相同。沿着这些方向:
SELECT
CASE WHEN sm/cnt = mn AND sm/cnt = mx THEN sum_area
ELSE area/cnt END
AS sum_area
FROM (
SELECT COUNT(n) cnt, SUM(n) sm, MIN(n) mn, MAX(n) mx, SUM(area_mq) sum_area
GROUP BY place_id
) a
所以,假设n的值为2和2 =&gt; sm / cnt = mn(4/2 = 2)和mx。如果它的值为2且1 =&gt; sm / cnt!= mn(3/2!= 1)。