2012-09-26 28 views
7

Tôi có hai bảng có thể được nhìn thấy trong hình ảnh đi kèm.SQL Tham gia trên Bảng Giá trị trong phạm vi Bảng B

Bảng A chứa cục, ThángTrung bình.

Bảng B chứa Tháng, Năm, RangeStart, RangeEndMàu.

Nếu bạn nhìn vào ảnh chụp màn hình Bảng B, bạn sẽ thấy cho mỗi Tháng bạn có giá trị Xanh lục, Vàng, Cam và Đỏ. Bạn cũng có một phạm vi.

Những gì tôi cần .........

Tôi cần một cột mới vào Bảng A tên 'Màu'. Trong cột này, tôi cần Green, Yellow, Orange hoặc Red. Yếu tố quyết định màu nào được gán cho tháng sẽ là cột 'Trung bình'.

Ví dụ:

DepartmentA cho May trung bình tương đương với 0.96 Sau khi tham khảo Bảng B, tôi có thể thấy rằng dòng 8, 0.75+ sẽ là phạm vi này phù hợp. Do đó, Màu đỏ là màu tôi muốn đặt trong bảng A bên cạnh mức trung bình của Mays.

Tôi đã để RangeEnd cho phạm vi cao nhất mỗi tháng là NULL vì về cơ bản là 75+, bất kỳ thứ gì lớn hơn 0.75 vị trí tại đây.

Bất kỳ ai cũng có thể chỉ cho tôi đúng hướng không quá tốn thời gian.

enter image description here

+0

Bạn có thực sự cần * lưu trữ * giá trị này trong cột trong Bảng A không? Nói chung tốt hơn là không lưu trữ thông tin có thể được tính toán lại. Bạn có thể không chỉ thêm cột này vào truy vấn * đối với các bảng này không? –

+0

Vì vậy, bạn không muốn sử dụng truy vấn phụ? – Anri

+1

không có một năm trong bảng A? – RomanKonz

Trả lời

11

bạn có thể sử dụng nó thẳng về phía trước:

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 trên toán tử 'between' –

0

Vì vậy, thực sự bạn muốn

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 không hứa hẹn nó hoạt động như tôi didnt có thời gian để nhập một số bảng và dữ liệu

0

Nếu bạn muốn thêm cột mới vào TableA và sau đó cập nhật nó với giá trị từ bảng B, đây là CẬP NHẬT thức:

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ạn nên sử dụng LEFT OUTER JOIN và cung cấp một giá trị mặc định nếu nó có thể là bạn không có dữ liệu trong bảng B cho một tháng nhất định và trung bình trong bảng 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) 

Ngoài ra, bạn nên kiểm tra xem liệu dữ liệu của bạn trong Bảng B có phụ thuộc vào năm hay không, vì điều này dường như xảy ra với bảng A.

Trong trường hợp này, bạn nên thêm lĩnh vực này để đề ra Tham gia của On khoản:

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) 

Trước khi bạn chạy các bản cập nhật, bạn có thể kiểm tra xem bạn đang nhận được các giá trị mong muốn bằng cách chạy truy vấn này đầu tiên:

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) 

Hy vọng điều này sẽ giúp :)

Các vấn đề liên quan