2016-01-06 4 views
0

У меня есть стол с несколькими городами, ресторанами и заказами (за ресторан) в течение определенного года. Из этого набора данных, у меня есть проблема о том, что:PostgreSQL, CASE WHEN и IF

  • В городах со средним порядка выше, чем 120, рестораны с менее чем 100 для того, должны быть прерваны.
  • В городах со средним заказом выше 60, рестораны с порядком менее 40 должны быть прерваны.
  • В городах со средним заказом выше 30 ресторанов с менее чем 20 порядком должны быть прерваны.

До сих пор я создал запрос, который может дать мне таблицу со средними заказами для каждого города и помечать их как 1, 2, 3 или 4 следующим образом:

SELECT cities, AVG(orders), COUNT(restaurants), 
     CASE 
     WHEN (AVG(orders) >= 120) THEN '1' 
     WHEN (120 > AVG(orders) >= 60) THEN '2' 
     WHEN (60 > AVG(orders) >= 30) THEN '3' 
     ELSE '4' 
     END AS ranking 
FROM c_cities 
GROUP BY 1 

Итак, теперь я хочу создать оператор, который будет проверять, например: для рейтинга = 1, если заказы> 100 -> сохранить их или обозначить как что-то. для оценки = 2, если заказы> 60 -> аналогичны и т. Д.

Я пытаюсь найти в нем логику и правильную инструкцию. Я думаю, что CASE ... КОГДА не может решить мою проблему. Я читаю документацию для инструкции IF, но я не могу заставить ее работать.

Я был бы признателен за любую помощь вы можете предоставить :)

+1

Пожалуйста, добавьте некоторые примеры данных и ожидаемый результат на основе этих данных (текст _formatted_, пожалуйста, никаких скриншотов. Или еще лучше: 'create table' и' insert' statements) –

ответ

1

Я следовать логике в своих точках пуля, но не остальная часть вопроса. Чтобы реализовать эту логику, используйте функции окна, а затем where. Например, следующий получают рестораны, которые должны быть «прерваны» в соответствии с вашим определением:

select cr.* 
from (select c.city, c.restaurant, avg(orders) as restaurant_avg, 
      (sum(orders) over (partition by city)/
       count(distinct restaurant) over (order by city) 
      ) as city_avg 
     from c_cities 
     group by c.city, c.restaurant 
    ) cr 
where (city_avg > 120 and restuarant_avg < 100) or 
     (city_avg > 100 and restaurant_avg < 80) or 
     (city_avg > 30 and restaurant_avg < 20); 

Идея заключается в том, чтобы получить средний город и ресторана, рассчитанные для каждой строки. Тогда вы можете просто сравнить их.

+0

cool :) Фактически раздел по тому, что я искал за :) Большое спасибо! –