在SSRS中使用模糊查找

时间:2016-03-09 20:59:13

标签: sql-server reporting-services

在SSRS中,假设我有两张桌子。例如,我有:

TABLE1

AvgValueLow | AvgValueHigh | Rate
-----------------------------------
7           | NULL         | 3
4           | 6.99         | 2
2           | 3.99         | 1
NULL        | 1.99         | 0

然后,我有一张表:

TABLE2

LastName    | FirstName    | Value
-----------------------------------
Johnson     | Mike         | 4.5
Wright      | Dennis       | 3.3
Morgan      | Ferris       | 1.7

现在,我在这些表之间没有共同的字段,因为它们存在于SSRS中完全独立的数据表中。此外,我需要能够从Table2中获取VALUE字段并查看它在Table1中的“范围”(例如,在Table2中,Mike Johnson,其值为4.5,将落在Table1的4到6.99之间) ,所以函数应该返回2的速率。

如果没有更简单的方法,我可以将Table1中的值硬编码到一个函数中,该函数将返回正确的值,但我希望能够保持选项打开以更改范围/表1中的值,而不必更改指向它的代码。

有任何建议或意见吗?

1 个答案:

答案 0 :(得分:1)

您可以使用简单的JOIN

SELECT t2.*, t1.Rate
FROM TABLE2 t2
JOIN TABLE1 t1
  ON t2.[Value] >= COALESCE(AvgValueLow, 0) 
 AND t2.[Value] <= COALESCE(AvgValueHigh,10000000)  -- set max possible value

LiveDemo

输出:

╔═══════════╦══════════╦═══════╦══════╗
║ FirstName ║ LastName ║ Value ║ Rate ║
╠═══════════╬══════════╬═══════╬══════╣
║ Mike      ║ Johnson  ║ 4,50  ║    2 ║
║ Dennis    ║ Wright   ║ 3,30  ║    1 ║
║ Ferris    ║ Morgan   ║ 1,70  ║    0 ║
╚═══════════╩══════════╩═══════╩══════╝

修改

您的范围会跳过从1.992.00的值1.995。如果是这种情况,您只能使用第一个值进行搜索:

WITH cte AS 
(
  SELECT t2.FirstName, t2.LastName, t2.[Value],  MAX(AvgValueLow) AS AvgValueLow
  FROM TABLE2 t2
  JOIN TABLE1 t1
    ON t2.[Value] >= COALESCE(t1.AvgValueLow,0)
  GROUP BY t2.FirstName, t2.LastName, t2.[Value]
)
SELECT c.FirstName, c.LastName, c.[Value], t1.Rate
FROM cte c
JOIN TABLE1 t1
  ON c.AvgValueLow = t1.AvgValueLow
  OR (c.AvgValueLow IS NULL AND t1.AvgValueLow IS NULL)

LiveDemo2

警告:我认为范围

没有空白