Sql 如何从另一个表中动态地找到一个数字的范围?

Sql 如何从另一个表中动态地找到一个数字的范围?,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,如果我有两张桌子: PersonID | Count ----------------- 1 | 45 2 | 5 3 | 120 4 | 87 5 | 60 6 | 200 7 | 31 SizeName | LowerLimit ----------------- Small | 0 Medium | 50 Large | 100 我试图找出如何执行查询以获得类似以下结果:

如果我有两张桌子:

PersonID | Count
-----------------
1        | 45
2        | 5
3        | 120
4        | 87
5        | 60
6        | 200
7        | 31

SizeName | LowerLimit
-----------------
Small    | 0
Medium   | 50
Large    | 100
我试图找出如何执行查询以获得类似以下结果:

PersonID | SizeName
-----------------
1        | Small
2        | Small
3        | Large
4        | Medium
5        | Medium
6        | Large
7        | Small
基本上,一个表指定未知数量的范围名称及其关联的整数范围。因此,person表中0到49的计数范围会得到一个“小”名称。50-99得到“中等”等,但我需要它是动态的,因为我不知道范围名称或整数值。我可以在单个查询中执行此操作,还是必须编写单独的函数来循环各种可能性?

请尝试以下操作:

SELECT PersonID, SizeName
FROM
   (
   SELECT
      PersonID,
      (SELECT MAX([LowerLimit]) FROM dbo.[Size] WHERE [LowerLimit] < [COUNT]) As LowerLimit
   FROM dbo.Person
   ) A
   INNER JOIN dbo.[SIZE] B ON A.LowerLimit = B.LowerLimit

虽然我使用的是仅存在于SQLServer2005+中的通用表表达式cte,但这可以通过多个查询来完成,在这些查询中,您可以创建一个临时表来存储等效的RangeStartEnd cte。诀窍是创建一个包含开始列和结束列的视图。

谢谢。这似乎是一个简单明了的解决方案。
SELECT p.PersonID, Ranges.SizeName
FROM People P
JOIN
    (
    SELECT SizeName, LowerLimit, MIN(COALESCE(upperlimit, 2000000)) AS upperlimit
    FROM (
        SELECT rl.SizeName, rl.LowerLimit, ru.LowerLimit AS UpperLimit
        FROM Ranges rl
        LEFT OUTER JOIN Ranges ru ON rl.LowerLimit < ru.LowerLimit
        ) r
    WHERE r.LowerLimit < COALESCE(r.UpperLimit, 2000000)
    GROUP BY SizeName, LowerLimit
    ) Ranges ON p.Count >= Ranges.LowerLimit AND p.Count < Ranges.upperlimit
ORDER BY PersonID
SELECT p.PersonID, Ranges.SizeName
FROM People P
JOIN
    (
    SELECT SizeName, LowerLimit, MIN(COALESCE(upperlimit, 2000000)) AS upperlimit
    FROM (
        SELECT rl.SizeName, rl.LowerLimit, ru.LowerLimit AS UpperLimit
        FROM Ranges rl
        LEFT OUTER JOIN Ranges ru ON rl.LowerLimit < ru.LowerLimit
        ) r
    WHERE r.LowerLimit < COALESCE(r.UpperLimit, 2000000)
    GROUP BY SizeName, LowerLimit
    ) Ranges ON p.Count >= Ranges.LowerLimit AND p.Count < Ranges.upperlimit
ORDER BY PersonID