2017-03-04 120 views
2
+--------+-------+----------+-----------+ 
| Maker | Model | SeatType | NoOfSeats | 
+--------+-------+----------+-----------+ 
| Airbus | 340 | E  |  220 | 
| Airbus | 340 | F  |  20 | 
| Airbus | 380 | E  |  300 | 
| Airbus | 380 | F  |  60 | 
| Boeing | 747 | E  |  300 | 
| Boeing | 747 | F  |  40 | 
| Boeing | 777 | E  |  200 | 
| Boeing | 777 | F  |  20 | 
| Boeing | 787 | E  |  250 | 
| Boeing | 787 | F  |  25 | 
+--------+-------+----------+-----------+ 

下面是我試圖建立這種「PlaneSeats」表SQL總計數

select Maker, count(distinct Model) 
from PlaneSeats 
group by Maker, Model 
having SUM(NoOfSeats) > 350; 

這裏的查詢結果查詢

+--------+-----------------------+ 
| Maker | count(distinct Model) | 
+--------+-----------------------+ 
| Airbus |      1 | 
+--------+-----------------------+ 

但我希望得到的是製造商和該製造商製造的飛機總數,也適用於製造總座位數超過350個的任何飛機的製造商。我知道計數應該是2,而不是1,因爲製造商空客有兩種型號。請幫我找出錯誤的地方。謝謝。

+0

你正在計數1,因爲製造商空中客車所有型號爲「380」有360個座位,但波音製造商的任何型號的沒有座位更多的則350 –

+1

@Poorva是的,我通過查看錶格來了解這一部分。謝謝;) – Misuti

回答

1

我認爲你需要聚合的兩個層次:

select maker, count(*) 
from (select maker, model, sum(NoOfSeats) as numseats 
     from planeseats ps 
     group by maker, model 
    ) mm 
where numseats > 350 
group by maker; 

編輯:

你希望所有的飛機將被計爲一個make當一個足夠大。這意味着轉動wherehaving條款:

select maker, count(*) 
from (select maker, model, sum(NoOfSeats) as numseats 
     from planeseats ps 
     group by maker, model 
    ) mm 
group by maker 
having max(numseats) > 350; 
+0

你能解釋一下這2級聚合的更多信息嗎?另外我試着把上面的代碼放進去,它變成了1而不是2. – Misuti

+0

我認爲* OP需要製造商製造的模型的總數,而不管座位的數量 - 只要至少一個模型已經超過350個座位。 – Strawberry

+0

@Strawberry。 。 。謝謝。我認爲你的解釋是正確的。 –