CASE WHEN + subconsulta

20/09/2007 - 17:30 por Matias | Informe spam
Hola a todos, antes que nada pido perdon por la mala explicación(soy muy
malo para esto)
Necesito mostrar en un campo del select una leyenda dependiendo de el valor
que me devuelva una subconsulta.
Supongamos que éste es el select(no pongo el original para no hacelo
complicado):

Select campo1, campo2, MiCampo = CASE WHEN campo1+campo2 IN (SELECT
TB.campo1+TB.campo2 FROM TABLA_B TB WHERE bla bla)
THEN 'LEYENDA_1' ELSE 'LEYENDA_2' END
FROM TABLA_A

seria si los valores de campo1 + campo2 de la tabla TABLA_A están en campo1
+ campo2 de la TABLA_B muestro una leyenda, si no, muestro otra.

El problema que tengo con el select q puse es que si encuentra una
conicidencia me pone LEYENDA_1 a todos los registos.

Pongo las tablas para q se entienda mejor:

TABLA_A
campo1 campo2
1 A
1 B
1 C

TABLA_B
ID descripcion campo1 campo2
10 pepe
11 juan 1 A
12 roque 1 C
13 ana

El resultado deberia ser
campo1 campo2 MiCampo
LEYENDA_2
1 A LEYENDA_1
1 C LEYENDA_1
LEYENDA_2

Gracias por su tiempo.

PD: es SQL 2K

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
20/09/2007 - 19:10 | Informe spam
Hola Matias,

Te recomiendo que uses el operador EXISTS y que el subquery sea
correlacionado.

select
a.campo1,
a.campo2,
case
when exists (
select *
from dbo.t2 as b
where b.campo1 = a.campo1 and b.campo2 = a.campo2
) then 'leyenda_1'
else 'leyenda_2'
end as lyenda
from
dbo.t1 as a


AMB

"Matias" wrote:

Mostrar la cita
#2 Matias
20/09/2007 - 21:01 | Informe spam
Hola Alejandro, gracias por responder! te comento que probe tu select
sugerido y me hace el mismo trabajo que con el IN, si encuentra una
conicidencia me pone LEYENDA_1 a todos los registos. Te pongo mi codigo a
ver si hice algo mal, anque es muy similar al tuyo.

select
a.descripcion, a.campo1, a.campo2,
case when exists (
select *
from TABLA_2 as b
LEFT JOIN TABLA_1 a ON b.campo1 = a.campo1 and b.campo2 = a.campo2
WHERE b.estado='J'
) then 'leyenda_1'
else 'leyenda_2'
end as leyenda
from
TABLA_1 as a

MIL GRACIAS!!!

"Alejandro Mesa" escribió en el
mensaje news:
Mostrar la cita
#3 jcac
20/09/2007 - 21:51 | Informe spam
No se si esto te sirva pero te puede dar una idea:

create table #tablaa(campo1 int, campo2 varchar(10))
create table #tablab(id int, descripcion varchar(10), campo1 int, campo2
varchar(10))
go
insert into #tablaa values (1, 'A')
insert into #tablaa values (1, 'B')
insert into #tablaa values (1, 'C')
go
insert into #tablab values (10, 'pepe', null, null)
insert into #tablab values (11, 'juan', 1, 'A')
insert into #tablab values (12, 'roque', 1, 'C')
insert into #tablab values (13, 'ana', null, null)
go

select a.campo1, a.campo2, case when a.campo1 is null and a.campo2 is null
then 'LEYENDA2' else 'LEYENDA1' end as MiCampo from #tablaa a right join
#tablab b on a.campo1 = b.campo1 and a.campo2 = b.campo2
go
drop table #tablaa
drop table #tablab
go

Saludos

"Matias" escribió en el mensaje
news:OjGUws5%
Mostrar la cita
#4 Alejandro Mesa
20/09/2007 - 21:58 | Informe spam
Matias,

Mostrar la cita
select
a.descripcion, a.campo1, a.campo2,
case when exists (
select *
from TABLA_2 as b
where b.estado='J' and b.campo1 = a.campo1 and b.campo2 = a.campo2
) then 'leyenda_1'
else 'leyenda_2'
end as leyenda
from
TABLA_1 as a
go


AMB


"Matias" wrote:

Mostrar la cita
#5 Matias
20/09/2007 - 22:52 | Informe spam
GRACIAS, funciono perfecto! pero no me funciona cuando lo pongo en el select
real, que es complicado ya que esta dentro de una subconsulta
correlacionada, está hecho así para poder filtrar luego segun la leyenda.
Pero bueno voy a seguir intentando a ver como lo meto dentro de el "gran"
select .

gracias nuevamente!!!!

"jcac" escribió en el mensaje
news:%23XqSa%237%
Mostrar la cita
Ads by Google
Search Busqueda sugerida