2016-01-06 154 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 :)實際上,分區是我正在尋找的東西爲:)非常感謝! –