如何从三个表连接获得MAX和COUNT?

时间:2013-01-30 12:43:04

标签: sql database sql-server-2008 join

我得到了一个面试问题,其中有一个以DB为模型的汽车销售。每个Car代表汽车销售中的实体汽车,其指的是MakeModel表。 Sale表会跟踪已售出的每个CarSale只包含一个Car,因此每个已售出的唯一Sale Car都有一条记录。

问题是找出汽车销售中售出最多的Model的名称。我回答了3级嵌套查询。面试官特别要求使用连接的解决方案,我只是成功地加入了没有聚合的表。

如何在使用其他两个聚合时加入3个表格(Car,Make,Sale)?

这是架构的草图。这里卖得最多的Model应该返回'Corolla'

Car

| carid|  modid | etc...
_________________
|  1   |    1   |
|  2   |    1   |
|  3   |    1   |
|  4   |    2   |
|  5   |    2   |

Make

| mkid |  name  |
_________________
|  1   | Toyota |
|  2   | Nissan |
|  3   |  Chevy |
|  4   |  Merc  |
|  5   |  Ford  |

Model

| modid|  name   | mkid |
________________________
|  1   |  Corolla|  1
|  2   |  Sunny  |  2
|  3   |  Carina |  1
|  4   |  Skyline|  2
|  5   |  Focus  |  5

Sale

|  sid |  carid | etc...
_________________
|  1   |    1   |
|  2   |    2   |
|  3   |    3   |
|  4   |    4   |
|  5   |    5   |

编辑:

使用MS SQL Server 2008

需要输出:

Model Name |  Count
_____________________
Corolla    |    3

即。已售出最多的Car模型。 请注意,Car表中只有3个Corollas和2个Sunnys,而Sale表对应于其他每个销售详细信息。 5 Sale个记录实际上是Corolla,Corolla,Corolla,Sunnnu和Sunny。

4 个答案:

答案 0 :(得分:3)

由于您使用的是SQL Server 2008,请使用Common Table ExpressionWindow Function

WITH recordList
AS
(
    SELECT  c.name, COUNT(*) [Count],
            DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) rn
    FROM    Sale a
            INNER JOIN Car b
                ON a.carid = b.carID
            INNER JOIN Model c
                ON b.modID = c.modID
    GROUP   BY c.Name
)
SELECT name, [Count]
FROM recordList
WHERE rn = 1

答案 1 :(得分:2)

当面试官要求这样做时,他们通常会要求你说你使用了窗口功能。您可以为每个销售分配一个按模型划分的唯一升序号码,您获得的最高销售数量将是最大数量。

http://www.postgresql.org/docs/9.1/static/tutorial-window.html

答案 2 :(得分:2)

基于您新添加的SQL Server 2008标记。如果您使用的是其他RDBMS,则可能需要使用limit而不是top,并将其放在top_sold_car子查询的末尾。

select Make.name as Make, Model.name as Model
from (
    select top 1 count(*) as num_sold
    from Car
    group by modid
    order by num_sold desc) as top_sold_car
join Model
    on (top_sold_car.modid = Model.modid)
join Make
    on (Model.mkid = Make.mkid)

答案 3 :(得分:2)

以下查询适用于oracle 11g。这是fiddle link

SELECT name FROM (
  SELECT model.name AS name FROM car  , sale , model
    WHERE car.carid=sale.carid
      AND car.modid=model.modid 
    GROUP BY model.name
    ORDER BY count(*) DESC )
WHERE rownum = 1;

或者

SELECT name FROM (
  SELECT model.name AS name FROM car  natural join sale natural join model    
    GROUP BY model.name
    ORDER BY count(*) DESC )
WHERE rownum = 1;

<强>输出

|    NAME |
-----------
| Corolla |