Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 模糊查找在SSRS中的应用_Sql Server_Reporting Services - Fatal编程技术网

Sql server 模糊查找在SSRS中的应用

Sql server 模糊查找在SSRS中的应用,sql-server,reporting-services,Sql Server,Reporting Services,在SSRS中,假设我有两个表。例如,我有: 表1 AvgValueLow | AvgValueHigh | Rate ----------------------------------- 7 | NULL | 3 4 | 6.99 | 2 2 | 3.99 | 1 NULL | 1.99 | 0 然后,我有一张桌子,上面有: 表2 LastName

在SSRS中,假设我有两个表。例如,我有:

表1

AvgValueLow | AvgValueHigh | Rate
-----------------------------------
7           | NULL         | 3
4           | 6.99         | 2
2           | 3.99         | 1
NULL        | 1.99         | 0
然后,我有一张桌子,上面有:

表2

LastName    | FirstName    | Value
-----------------------------------
Johnson     | Mike         | 4.5
Wright      | Dennis       | 3.3
Morgan      | Ferris       | 1.7
现在,这些表之间没有共同的字段,因为它们存在于SSR中完全独立的数据表中。此外,我需要能够从表2中获取值字段,并在表1中查找它所处的“范围”(例如,在表2中,值为4.5的Mike Johnson将在表1中的4到6.99之间着陆,因此函数应返回2的速率)

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


有任何建议或建议吗?

您可以使用简单的
加入

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
编辑:

您的范围将跳过从
1.99
2.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)


警告:我假设范围内没有间隙。优雅的我喜欢。非常感谢。
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)