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_mqmqで表した場所の表面積です。

私がしなければならないのはarea_mq、これらのルールの合計を計算するためのコンパクトなクエリを見つけることです。

  • 同じに対して等しい場合nは、すべてをカウントします(f.ex for = 2、合計で9020をカウントします)place_idarea_mqplace_id
  • 同じに対して異なる場合nは、 1回だけカウントします(これらの種類の「場所」の場合、値は同じになるため、実行できます。たとえば、= 4、2つの20があり、合計は20で40ではありません) 。place_idarea_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の合計カウント、および最小値と最大値(多分やり過ぎ)を取ります。これを使用して、 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 に答える