我有一张桌子:
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;