2012-09-26 4 views
7

У меня есть две таблицы, которые можно увидеть в сопроводительном изображении.SQL Присоединиться к таблице. Значение в таблице B.

Таблица A содержит отдел, Месяц и Средняя.

Таблица B содержит Месяц, Год, RangeStart, RangeEnd и Цвет.

Если вы посмотрите на снимок экрана Таблица B, вы увидите, что за каждый месяц у вас есть значение Зеленый, Желтый, Оранжевый и Красный. У вас также есть диапазон.

Что мне нужно .........

мне нужен новый столбец на таблице A под названием 'Color'. В этой колонке мне нужно либо зеленое, желтое, оранжевое, либо красное. Решающим фактором, для которого цвет назначен месяц, будет столбец «Средний».

Например:

DepartmentA для Мэя Среднее равно 0.96 После ссылки Таблица B, я могу видеть, что строка 8, 0.75+ будет диапазон это вписывается. Поэтому красный цвет - это цвет, который я хочу поместить в стол A рядом с Mays в среднем.

Я оставил RangeEnd для самого высокого диапазона в месяц как NULL, так как это в основном 75+, что-то большее, чем 0.75 слотов здесь.

Может ли кто-нибудь указать мне правильное направление, которое не требует много времени.

enter image description here

+0

ли вам действительно нужно * магазин * это значению в колонке в таблице А? Обычно лучше не хранить информацию, которая может быть пересчитана. Не могли бы вы просто добавить этот столбец в * запрос * к этим таблицам? –

+0

Значит, вы не хотите использовать подзапросы? – Anri

+1

нет ли года в таблице A? – RomanKonz

ответ

11

вы можете использовать его прямо вперед:

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 
+2

+1 на операторе 'between' –

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

Im не обещает он работает, как у меня не было времени, чтобы ввести некоторые таблицы и данные

0

Если вы хотите добавить новый столбец в таблицуA и затем обновить она со значениями из таблицы 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) 

Вы должны использовать 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 на год, так как это, кажется, происходит с таблицей А.

В этом случае, вы должны добавить это поле в Join по статье:

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) 

Надеется, что это помогает :)

Смежные вопросы