当另一列具有相等的值时,对一列进行SUM

时间:2012-05-22 08:31:47

标签: mysql

假设我有这个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和子查询会很简单......但是在这些条件下,我被卡住了。

3 个答案:

答案 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)。