2016-01-06 152 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_ text please,no screenshots or even better:'create table' and'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 :)实际上,分区是我正在寻找的东西为:)非常感谢! –