在 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
现在,这些表之间没有通用字段,因为它们存在于 SSRS 中完全独立的数据表中。此外,我需要能够从 Table2 中获取 VALUE 字段,并查找它在 Table1 中介于哪个"范围"之间(例如,在 Table2 中,值为 4.5 的 Mike Johnson 将在 Table1 上介于 4 和 6.99 之间,因此该函数应返回 Rate 2)。
如果没有更简单的方法可以做到这一点,我可以将 Table1 中的值硬编码到一个将返回正确值的函数中,但我希望能够保留更改 Table1 中的范围/值的选项,而不必更改指向它的代码。
请问有什么建议或建议吗?
您可以使用简单的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
警告:我假设范围没有间隙