我有两张桌子可以在附图中看到。
表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
个插槽。
任何人都可以指出我的方向并不太费时。
答案 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)
希望这会有所帮助:)