2012-05-22 2 views
4

Давайте предположим, что у меня есть эта MySQL таблица:SUM столбец, когда другой столбец имеет равные значения

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 обозначает идентификатор области, area_mq является площадью поверхности места в квадратных метрах ,

Что я должен сделать, это найти компактный запрос для расчета суммы area_mq с этими правилами:

  • если n является равна для одной и той же place_id, то считать каждую area_mq (f.ex для place_id = 2, я считаю 90 и 20 в сумме)
  • , если это nотличается для той же place_id, то рассчитывать area_mq только один раз (возможно, потому что для такого рода «мест» значение будет одинаковым; f.ex. place_id = 4, есть два 20, я суммирую только 20, а не 40).

В этом примере моя правильная сумма будет равна: 50 + (90 + 20) + 10 + 20 + (15 + 25).

Могу ли я выполнить это с помощью запроса (без кода или процедур)? Если требования для n были отменены, это было бы просто с GROUP BY и подзапросом ... но с этими условиями я застрял.

+0

п = 1 всегда п значение, которое вы хотите использовать? – Manuel

+0

Нет @ dragon112, это может быть произвольно – Cranio

ответ

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

Испытано here

+0

Это излишество, работает как шарм! Огромное спасибо. – Cranio

+0

Что делать, если n NULL? Я узнаю, что COUNT (DISTINCT) исключает нулевые значения. Я думал, что это подзапрос, в котором нулевые значения анализируются на 1, но, может быть, есть лучшая идея? – Cranio

+0

Нули не учитываются. В качестве обходного пути вы можете использовать coalesce для особого значения, см. Тест [здесь] (http://sqlfiddle.com/#!3/94001/1) –

0

Из чего я вижу в вашем шаблоне все с n = 1?

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

Я выполняю проверку, которая возвращает 1 или 0, а затем умножаю ее на значение столбца.

+0

Нет, я сожалею, здесь n является прогрессивным для простоты, но это может быть произвольное значение. – Cranio

0

Думаю, вы могли бы использовать что-то вроде этого. Возьмем сумму и подсчет из н, а также мин и макс (может быть избыточна); используйте это, чтобы выяснить, являются ли все значения 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 

Так, скажем, п имеет значения 2 и 2 => см/CNT = Mn (4/2 = 2) и м х. Если он имеет значения 2 и 1 => sm/cnt! = Mn (3/2! = 1).

Смежные вопросы