我有一张桌子:
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来将范围分组到一个范围。
非常感谢任何建议!
答案 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;