在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中的值,而不必更改指向它的代码。
有任何建议或意见吗?
答案 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.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)
的 LiveDemo2
强>
警告:我认为范围
没有空白