sql-server-2008 – 将范围分组到一个范围

我有一张桌子:

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

我已经在这个论坛和其他地方阅读了很多关于按范围分组的帖子.但这些例子的重点是1个单一价格,应该分为一个范围.我理解如何通过连接等来做到这一点,但是我无法弄清楚如何编写SQL来将范围分组到一个范围.

任何建议都非常感谢!

最佳答案 您希望将tblUnit与tblPriceRange匹配,以匹配范围重叠的行.如果第二个的开始位于第一个结束之前,并且第一个结束之前的第一个开始之前,则两个范围重叠,因此您的连接条件将如下所示:

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;
点赞