2012-09-26 2 views
7

첨부 된 이미지에서 볼 수있는 두 개의 표가 있습니다.SQL 결합 표 A 범위 내의 값

표 A부서, 평균가 포함되어 있습니다.

표 B, , 의 RangeStart, rangeEnd의컬러이 포함되어 있습니다.

표 B을 보면 각 달에 녹색, 노란색, 주황색 및 빨간색 값이 표시됩니다. 범위도 있습니다. 내가 필요로 무엇

는 .........

나는 '색상'라는 이름 표 A에 새 열을 필요로한다. 이 열에서는 녹색, 노란색, 주황색 또는 빨간색 중 하나가 필요합니다. 해당 월에 할당 된 색상의 결정 요소는 '평균'열입니다. 예를 들어

: 5 월 보통 표 B을 참조하면 0.96 같다 DepartmentA위한

는 I가 라인 (8)을 볼 수 0.75+ 이것이에 맞는 범위 일 것이다. 그러므로 붉은 색은 내가 선호하는 색이다 테이블 A 메이스 평균 옆.

기본적으로 75+이므로 여기에는 0.75 슬롯보다 큰 값이 포함되어 있으므로 월간 최고 범위의 RangeEnd를 NULL로 남겨 둡니다.

누구나 시간이 너무 많이 걸리지 않는 올바른 방향으로 나를 가리킬 수 있습니까?

enter image description here

+0

당신이 정말 표 A의 열의에 * 저장 *이 값이 필요하십니까? 일반적으로 다시 계산할 수있는 정보를 저장하지 않는 것이 좋습니다. 이 열을 * 테이블 *에 추가 할 수 있습니까? –

+0

서브 쿼리를 사용하지 않으시겠습니까? – Anri

+1

테이블 A에 1 년이 없습니까? – RomanKonz

답변

11

당신이 정직하고 사용할 수 있습니다 입력하는 시간이 didnt가로 일하고 약속하지

임 :

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

'between'연산자에 +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)) 
그것이 내가 일부 테이블 및 데이터
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 조인하고 주어진 달 동안 테이블 B 데이터를하지 않아도 가능한 경우 기본값을 제공 사용해야합니다

및 표 A의 평균값입니다.

게다가 테이블 A에서 발생하는 것으로 보이므로 표 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) 

희망이 도움이 :)