SQL连接表B范围内的值

时间:2012-09-26 14:34:41

标签: sql sql-server sql-server-2008 tsql

我有两张桌子可以在附图中看到。

表A 包含部门平均

表B 包含 RangeStart RangeEnd 颜色

如果您查看表B 的屏幕截图,您会看到每个月都有绿色,黄色,橙色和红色值。你也有一个范围。

我需要什么.........

我需要在表A 上添加一个名为“Color”的新列。在本专栏中,我需要绿色,黄色,橙色或红色。将颜色分配给月份的决定因素是“平均”列。

例如:

DepartmentA for May's Average等于0.96 在引用表B 时,我可以看到第8行0.75+将是它适合的范围。因此,红色是我希望放置在Mays平均值旁边的表A 中的颜色。

我已将RangeEnd保留为每月最高范围为NULL,因为它基本上为75+,此处的任何内容都大于0.75个插槽。

任何人都可以指出我的方向并不太费时。

enter image description here

3 个答案:

答案 0 :(得分:17)

你可以直接使用它:

select *
from table a
    join table b
        on a.month = b.month
           and a.average between b.rangestart and isnull(b.rangeend,10000) -- 100000 = greater than max value

答案 1 :(得分:0)

所以你真的想要

select a.*,b.colour from a 
left join table b on a.month=b.month 
 and ((b.rangeend is null and a.average>b.rangestart) 
    or (a.average between b.rangestart and b.rangeend))

我不承诺它有效,因为我没有时间输入一些表格和数据

答案 2 :(得分:0)

如果要将新列添加到TableA,然后使用表B中的值进行更新,则这是最终的更新:

UPDATE TableA
SET Colour = B.Colour
FROM TableA A
INNER JOIN TableB B ON B.Month = A.Month AND B.RangeStart < A.Average AND (B.RangeEnd IS NULL OR B.RangeEnd > A.Average)

您应该使用LEFT OUTER JOIN并提供默认值,如果您可能在给定月份中没有表B中的数据并且在表A中没有平均值。

UPDATE TableA
SET Colour = ISNULL(B.Colour, N'SomeColour')
FROM TableA A
LEFT OUTER JOIN TableB B ON B.Month = A.Month AND B.RangeStart < A.Average AND (B.RangeEnd IS NULL OR B.RangeEnd > A.Average)

此外,您应该检查表B中的数据是否取决于年份,因为表A似乎会发生这种情况。

在这种情况下,您应该将此字段添加到Join的On子句:

UPDATE TableA
SET Colour = B.Colour
FROM TableA A
INNER JOIN TableB B ON B.Year = A.Year AND B.Month = A.Month AND B.RangeStart < A.Average AND (B.RangeEnd IS NULL OR B.RangeEnd > A.Average)

在运行更新之前,您可以先通过运行此查询来检查是否获得了所需的值:

SELECT Department, A.Month, Average, B.Colour
FROM @tableA A
INNER JOIN @tableB B ON B.Month = A.Month AND B.RangeStart < A.Average AND (B.RangeEnd IS NULL OR B.RangeEnd > A.Average)

希望这会有所帮助:)