我有一个表,其中存储了一些数据组合的百分比值,如下所示
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,它应该分配Low;如果百分比在20到40之间,它应该分配Medium;如果百分比在40到60之间,它应该分配On Track;如果百分比大于60,它应该分配High。
是否可以在SQL查询中实现。我尝试使用case,但我无法在case中实现范围值。
首先,回答您的实际问题:这将把两个表连接在一起,但是最后的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