2010-04-22 12 views
6

Necesito de alguna manera usar la sintaxis CASE (que está más allá de mí) para afectar los resultados de la base de datos según los criterios. Tengo un montón de regalías en 0. # formulario (royalty) Tengo un número de identificación del título (title_id) y tengo que mostrar el nuevo aumento en las regalías para que pueda usar los datos.DB2 CASE Statement

IF: they have a current royalty of 0.0 - 0.1 = 10% raise 
IF: they have 0.11 - 0.15 = 20% raise 
IF: royalty >= 0.16 = 20% raise 

Cualquier ayuda sería muy apreciada.

create table royalites (
title_id char(6), 
lorange  integer, 
hirange  integer, 
royalty  decimal(5,2)); 
+0

Los dos últimos "IF:" s se pueden colapsar en una sola condición, ya que son adjecent ... solo una nota – AtliB

Respuesta

9

En realidad, no lo hace necesidad de utilizar el case declaración:

update royalties set royalty = royalty * 1.2 
    where royalty >= 0.16; 
update royalties set royalty = royalty * 1.2 
    where royalty >= 0.11 and royalty < 0.16; 
update royalties set royalty = royalty * 1.1 
    where royalty < 0.11; 

(bajo control transaccional si necesita atomicidad). Posiblemente podrías combinar los dos primeros si tienen el mismo multiplicador que tu pregunta.

Funciona asegurándose de hacer los valores más altos primero y limitar qué filas se ven afectadas en la cláusula where.

si siente que debe utilizar una declaración case:

update royalties set royalty = 
    case when royalty >= 0.16 then royalty * 1.2 
    case when royalty >= 0.11 and royalty < 0.16 then royalty * 1.2 
    case when royalty < 0.11 then royalty * 1.1 
    end; 

cambiar sólo lo que estás sacando de la mesa (en lugar de cambiar la propia tabla) y compararla con la actual:

select title_id, lorange, hirange, royalty, 
    case when royalty >= 0.16 then royalty * 1.2 
    case when royalty >= 0.11 and royalty < 0.16 then royalty * 1.2 
    case when royalty < 0.11 then royalty * 1.1 
    end as new_royalty 
    from royalties; 
+0

Sí, pero quiero mostrar esto sin alterar los datos, para que pueda mostrar una comparación de la dos números –

+0

Disculpas, @gamerzfuse, pensé que querías modificar la tabla actual. Vea mi actualización sobre cómo simplemente cambiar los datos que salen de la tabla. – paxdiablo

+0

Gracias, segunda parte trabajó un encanto! –

0

no sé la sintaxis exacta de DB2, ni si es diferente de Oracle o SQL Server, pero me imagino algo como lo siguiente:

update royalties as r 
set r.royalty = r.royalty * (
    select case 
       when r.royalty between 0.0 and 0.1 then 1.1 
       when r.royalty > 0.11 then 1.2 
      and 
     from royalties 
) 

Algo en torno a este código podría hacer el trabajo, si entiendo la pregunta correctamente. Esto aplicaría el aumento para cada fila cada vez que se inicie la actualización. Puede agregar una cláusula where si desea realizar una actualización condicional para cada fila.

EDITAR

sí, pero yo quiero mostrar esto sin alterar los datos, por lo que puede mostrar una comparación de los dos números

Qué quiere decir que sólo se desea llevar a cabo una declaración de selección con el valor inicial en una columna, y el valor elevado en otra?