2017-03-04 78 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。 。 。谢谢。我认为你的解释是正确的。 –