4

假设我有这个 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则计算每个(f.ex for =2,我计算总和中的 9020)place_idarea_mqplace_id
  • 如果相同n不同,则只place_id计算一次(可以这样做,因为对于这些“地方”,值将是相同的;f.ex. =4,有两个 20,我只求和 20 而不是 40) .area_mqplace_id

在这个例子中,我的正确总数是:50 + (90 + 20) + 10 + 20 + (15 + 25)。

我可以通过查询(无代码或过程)来完成此操作吗?如果对 n 的要求颠倒了,那么使用 GROUP BY 和子查询会很简单......但是在这些条件下,我被卡住了。

4

3 回答 3

6
select place_id, sum(area_sq)/count(distinct n)
from your_table
group by place_id;

在这里测试

于 2012-05-22T08:43:04.190 回答
0

从我在您的模式中看到的所有n = 1内容都添加了?

SELECT SUM((n = 1) * area_mq) AS total
FROM table_name

我进行验证,返回 1 或 0,然后将其与列值相乘。

于 2012-05-22T08:42:31.190 回答
0

我想你可以使用这样的东西。取n的总和计数,以及minmax(可能是矫枉过正);用它来确定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 => sm/cnt = mn (4/2 = 2) 和 mx。如果它的值为 2 和 1 => sm/cnt != mn (3/2 != 1)。

于 2012-05-22T08:42:50.590 回答