0

我有一个面试问题,其中有一个以数据库为模型的汽车销售。每个Car代表汽车销售中的一辆实体汽车,它指的是一个Make和一个Model表。一张Sale桌子跟踪每一个Car售出的东西。ASale仅包含一个Car,因此Sale每个Car已售出的唯一产品都有一个记录。

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

在使用其他两个聚合时,您将如何加入以下 3 个表(汽车、制造、销售)?

这是模式的粗略草图。这里卖得最多的Model应该是'卡罗拉'

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销量最多的型号。请注意,表中只有 3 个 Corollas 和 2 个 Sunnys,CarSale表中的每一个都对应于其他销售细节。这 5Sale条记录实际上是 Corolla、Corolla、Corolla、Sunnnu 和 Sunny。

4

4 回答 4

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
于 2013-01-30T13:12:11.360 回答
2

当面试官提出这个要求时,他们通常希望你说你会使用窗口函数。您可以给每个销售一个按型号划分的唯一升序数字,您获得的最高销售数字将是最大数量。

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

于 2013-01-30T12:58:05.647 回答
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)
于 2013-01-30T12:58:14.960 回答
2

以下查询适用于 oracle 11g 。这是小提琴链接

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 |
于 2013-01-30T14:03:19.997 回答