15

我有两张桌子,可以在随附的图片中看到。

表 A包含部门月份平均值

表 B包含MonthYearRangeStartRangeEndColor

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

我需要的.........

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

例如:

5 月平均值的 DepartmentA 等于0.96 在参考表 B时,我可以看到第 80.75+行将是适合的范围。因此,红色是我想放在A 表中 Mays 平均值旁边的颜色。

我已经将 RangeEnd 保留为每月的最高范围,因为它基本上是 NULL 75+,任何大于0.75这里的插槽。

谁能指出我不太耗时的正确方向。

在此处输入图像描述

4

3 回答 3

23

你可以直接使用它:

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
于 2012-09-26T14:40:45.773 回答
3

所以你真的想要

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))

我不保证它会起作用,因为我没有时间输入一些表格和数据

于 2012-09-26T14:39:48.160 回答
0

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

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)

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

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)

希望这可以帮助 :)

于 2012-09-26T14:54:11.590 回答