3

我有一张桌子:

tblUnit (ID, Name, PriceFrom, PriceTo)

1, Audi, 170, 340
2, BMW,  250, 290
3, Ford, 275, 500
4, Kia,  110, 250
5, VW,   135, 460

然后我预定义了这样的价格范围:

tblPriceRange(ID, PriceFrom, PriceTo)

1,   0,  100
2, 100,  200
3, 200,  300
4, 300,  400
5, 400, 1000

我正在尝试计算一个或多个价格范围内存在的车辆数量。宝马只有 1 个范围,而奥迪有 3 个范围,福特有 3 个。

我追求的结果应该是这样的:

VehiclesPerRange:
(RangeFrom, RangeTo, NoVehicles)
  0, 100,  0
100, 200,  3
200, 300,  5
300, 400,  3
400, 1000, 2

我已经阅读了这个论坛和其他地方的很多关于按范围分组的帖子。但是这些示例都集中在一个应该分组到一个范围内的单一价格上。我知道如何通过连接等来做到这一点,但我不知道如何编写 SQL 来将一个范围分组到一个范围内。

任何建议都非常感谢!

4

1 回答 1

2

您想加入范围重叠的匹配行tblUnittblPriceRange如果第二个范围的开始在第一个结束之前并且第一个的开始在第二个结束之前,则两个范围重叠,因此您的连接条件如下所示:

SELECT *
FROM dbo.tblUnit u
JOIN dbo.tblPriceRange p
ON u.PriceFrom < p.PriceTo
AND p.PriceFrom < u.PriceTo

之后,您只需要分组和计数:

SELECT PriceFrom, PriceTo, COUNT(1)
FROM(
    SELECT p.PriceFrom, p.PriceTo
    FROM dbo.tblUnit u
    JOIN dbo.tblPriceRange p
    ON u.PriceFrom < p.PriceTo
    AND p.PriceFrom < u.PriceTo
)X
GROUP BY PriceFrom, PriceTo;
于 2013-01-28T14:56:58.047 回答