2012-09-26 21 views
7

Mam dwie tabele, które można zobaczyć w towarzyszącym obrazie.SQL Dołącz do tabeli Wartość z zakresu B tabeli

Tabela A zawiera Departament, miesiąc i Średnia.

Tabela B zawiera Miesiąc, Rok, RangeStart, RangeEnd i Kolor.

Jeśli spojrzysz na zrzut ekranu z Tabeli B, zobaczysz dla każdego miesiąca, że ​​masz zieloną, żółtą, pomarańczową i czerwoną wartość. Masz także zasięg.

Co muszę .........

muszę nową kolumnę na Tabeli A nazwie 'Kolor'. W tej kolumnie potrzebuję zielonego, żółtego, pomarańczowego lub czerwonego. Decydującym czynnikiem określającym kolor przypisany do miesiąca będzie kolumna "Średnia".

Na przykład:

DepartmentA na maj jest średnia jest równa 0.96 Po przedstawieniu Tabela B, widzę, że linia 8, 0.75+ będzie zakres ten pasuje do. Dlatego czerwony jest kolorem, który chcę umieścić w tabeli A obok średniej Mays.

Zostawiłem RangeEnd dla najwyższego zakresu na miesiąc jako NULL, ponieważ jest to w zasadzie 75+, wszystko, co jest większe niż 0.75 tutaj.

Czy ktoś może wskazać mi właściwy kierunek, który nie jest zbyt czasochłonny.

enter image description here

+0

Czy naprawdę trzeba * sklep * wartość w kolumnie w tabeli a? Generalnie lepiej nie przechowywać informacji, które można ponownie przeliczyć. Czy nie możesz dodać tej kolumny do * zapytania * w odniesieniu do tych tabel? –

+0

Więc nie chcesz używać podzapytań? – Anri

+1

nie ma roku w tabeli A? – RomanKonz

Odpowiedz

11

można go używać proste:

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 dla operatora 'między" –

0

Tak naprawdę chcesz

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 nie obiecując, że działa jak nie miałam czasu, aby wprowadzić kilka tabel i danych

0

Jeśli chcesz dodać nową kolumnę do tabeli A, a następnie zaktualizować to z wartościami z tabeli B, jest to ostateczny 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) 

Należy użyć LEFT OUTER JOIN i podać wartość domyślną, jeśli to możliwe, że nie masz dane w tabeli B dla danego miesiąca i średnio w tabeli 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) 

Poza tym, należy sprawdzić, czy dane w tabeli B zależy od roku, ponieważ wydaje się stało z tabeli A.

W tym przypadku, należy dodać to pole do Zarejestrowany Na klauzuli:

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) 

Przed uruchomieniem aktualizacji, można sprawdzić, czy kupowana żądane wartości poprzez uruchomienie tej kwerendy pierwszy:

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) 

Nadzieja to pomaga :)

Powiązane problemy