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:

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



Respuesta Responder a este mensaje
#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:
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:

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



Respuesta Responder a este mensaje
#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%
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

Respuesta Responder a este mensaje
#4 Alejandro Mesa
20/09/2007 - 21:58 | Informe spam
Matias,

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



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:

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



Respuesta Responder a este mensaje
#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%
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%
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





Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida