将范围分组到范围

时间:2013-01-28 14:47:29

标签: sql-server-2008 stored-procedures group-by

我有一张桌子:

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来将范围分组到一个范围。

非常感谢任何建议!

1 个答案:

答案 0 :(得分:2)

您希望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;