在SQL查询中实现范围条件

时间:2015-08-17 14:58:59

标签: sql database

我有一个表存储某些数据组合的百分比值,如下所示

Area_ID Period_ID Business_ID Percentage 
 1         1           1         50 
 1         1           2         40

我有另一个存储阈值范围的表,比如

Threshold_ID  Percentage    Description
  1                20           Low
  2                40           Medium
  3                60           On Track

现在我必须找出上述组合属于哪个阈值。如果百分比小于20,则应分配低;如果百分比介于20和40之间,则分配为中;如果介于40和60之间,则分配为On Track ,如果大于60,则为高。

是否可以在SQL查询中实现它。我尝试使用大小写,但我无法实现范围值。

1 个答案:

答案 0 :(得分:0)

首先,回答你的实际问题:这将把两个表连接在一起,但最后的WHERE子句将过滤掉你看到的额外行。不知道你的实际表名是什么,所以请用必要的东西替换它们。

SELECT *
FROM 
    Perc p
     LEFT JOIN 
    Thresh t ON 
        p.Percentage <= t.Percentage    -- return all ranges that are greater than the current value
WHERE NOT EXISTS
  (
    SELECT 1 
    FROM Thresh x 
    WHERE   -- eliminate ranges that are higher than this range and greater than the current value
        t.Percentage > x.Percentage AND         
        p.Percentage <= x.Percentage            
  )

表现可能不那么好,因为额外的WHERE NOT EXISTS会降低你的速度。一个远远好得多的模型(写在SQL Server上,因为我没有可用的db2实例:

CREATE TABLE #Threshold
  (
    Threshold_ID INT IDENTITY(1,1),
    PercentageStart INT,
    PercentageEnd INT,
    Description VARCHAR(20)
  )

INSERT INTO #Threshold 
  (
    PercentageStart,
    PercentageEnd,
    Description
  )

SELECT 0, 20, 'Low'
UNION 
SELECT 21, 40, 'Medium'
UNION
SELECT 41, 60, 'On Track'
UNION
SELECT 61, 100, 'High'


CREATE TABLE #Percentage (Percentage INT)

INSERT INTO #Percentage 
SELECT 40
UNION
SELECT 50


SELECT *
FROM 
    #Percentage p 
     INNER JOIN 
    #Threshold t ON 
        p.Percentage BETWEEN t.PercentageStart AND t.PercentageEnd


DROP TABLE #Percentage
DROP TABLE #Threshold