2012-09-26 11 views
7

Tengo dos tablas que se pueden ver en la imagen que lo acompaña.SQL Unirse a la tabla Un valor dentro del rango de la Tabla B

Tabla A contiene Departamento, Mes y media.

Tabla B contiene Mes, Año, RangeStart, rangeEnd y color.

Si mira la captura de pantalla de Tabla B, verá que por cada mes tiene un valor Verde, Amarillo, Naranja y Rojo. También tienes un rango.

Lo que necesito .........

necesito una nueva columna en la tabla A llamado 'Color'. En esta columna, necesito Verde, Amarillo, Naranja o Rojo. El factor decisivo sobre qué color se asigna al mes será la columna 'Promedio'.

Por ejemplo:

departmentA para de mayo Promedio es igual a 0.96 Al referencia Tabla B, I puede ver que la línea 8, 0.75+ será el rango esto encaja en. Por lo tanto, el rojo es el color que quiero colocar en , tabla A junto a la media de Mays.

He dejado RangeEnd para la gama más alta por mes como NULL, ya que es básicamente 75+, cualquier cosa mayor que 0.75 ranuras aquí.

¿Alguien puede señalarme en la dirección correcta que no consume demasiado tiempo?

enter image description here

+0

lo que realmente necesita a * tienda * este valor en una columna en la tabla a? En general, es mejor no almacenar la información que se puede volver a calcular. ¿No podría agregar esta columna a una * consulta * contra estas tablas? –

+0

¿Entonces no quieres usar subconsultas? – Anri

+1

¿No hay un año en la tabla A? – RomanKonz

Respuesta

11

se pueden utilizar en línea recta hacia adelante:

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 en el operador 'between' –

0

Así que en realidad se quieren

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

No estoy prometiendo que funciona como yo no tengo tiempo para entrar en algunas tablas y datos

0

Si desea agregar la nueva columna a TableA y luego actualizar con los valores de la tabla B, se trata de la última actualización:

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) 

Debe utilizar LEFT OUTER JOIN y proporcionar un valor predeterminado si es posible que usted no tiene datos de la Tabla B para un mes determinado y medio en la tabla 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) 

Además, se debería comprobar si los datos de la tabla B depende del año, ya que parece suceder con la tabla A.

En este caso, se debe añadir este campo a los de combinación en la cláusula:

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) 

Antes de ejecutar la actualización, puede estar seguro que está recibiendo los valores deseados mediante la ejecución de esta consulta en primer lugar:

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) 

Espero que esto ayude :)

Cuestiones relacionadas