2017-04-20 46 views
0

Write a query below that retrieves the departure harbour, the departure date, the amount of voyages (rows) as column n, the minimum and maximum tonnage in each group (min_t/max_t) from the voyages table. Group by departure harbour and departure date. Filter out rows where departure harbour is NULL or equal to Batavia. Filter the groups to have at least two voyages in them.如何重命名此SQL片段中的多個列?

我很接近,但我不明白他們的意思與in each group (min_t/max_t)

什麼我需要做的呢?這是我應該得到的表...

# departure_harbour departure_date n min_t max_t 
1 Batavia    1768   2 136  1150 

而這就是我與我的查詢....

# departure_harbour departure_date MIN(tonnage) MAX(tonnage) n 
1 NULL     1793   488    890   3 

我有這樣的:

SELECT departure_harbour, 
     departure_date, 
     MIN(tonnage), 
     MAX(tonnage), 
     COUNT() AS n 
FROM voyages 
GROUP BY departure_harbour, 
     departure_date 
HAVING departure_harbour IS NULL 
    OR departure_harbour = "Batavia" 

當我在AS之後聲明瞭min_t和max_t,它只是給了我錯誤。我不知道該怎麼做。除此之外:我如何更改表格中顯示的列的順序?

+2

你得到了什麼錯誤信息? *你究竟如何嘗試對列進行別名? – Siyual

+0

嗯,我試過(..)COUNT()AS n,max_t,min_t,但這給了我錯誤:查詢失敗:沒有這樣的列。 – Siyah

+1

離開_哈寶有什麼問題? – xQbert

回答

0

這就是我閱讀作業時想到的。

因爲我們需要排除所有空值和Batavia,所以我使用了coalesce將null離港港口轉換爲Batavia。

SELECT departure_harbour 
    , departure_date 
    , count(1) n 
    , min (tonnage) min_t 
    , max(tonnage) max_t 
FROM voyages 
WHERE coalesce(departure_harbour,'Batavia') <> 'Batavia' 
GROUP BY departure_harbour 
     , departure_date 
HAVING count(1)>1 
+0

我完全忘記了我可以使用coalesce!這很合乎邏輯。謝謝! – Siyah

0
  1. 您應該NULL和巴達維亞,你只檢索NULL和錫蘭過濾港口。你應該修理你的條款。

  2. min_t和max_t是您應該給予聚合列的名稱,例如MIN(tonnage) as min_t

  3. 您沒有過濾羣組至少有航程。你需要添加一個條件來爲此添加子句。

除了這些,你的努力似乎沒問題。

+0

好吧,讓min_t和max_t給出如何?在我使用的AS之後或其他地方逗號分隔了嗎?過濾OUT的意義究竟是什麼意思? – Siyah

+1

@Siyah你應該單獨重命名每一列。 '... min(噸位)爲min_t,max(噸位)爲max_t ...'並且過濾不包括滿足條件的行。由於'HAVING'根據條件選擇行,因此您擁有的條款應該具有相反的條件。 – infiniteRefactor