sobre consulta con CASE

01/02/2005 - 17:38 por Carlos | Informe spam
Aver que esto me mata...

tengo esta consulta:

SELECT TOP 100 PERCENT cc.ID_congreso, cc.titulo, ci.ID_inscripcion,
ci.apellido1, ci.apellido2, ci.nombre AS nomb, ci.tipo, cra.forma_pago,
cra.fecha_abono, cra.importe, cra.facturar_tipo,
cde.facturar, cde.facturado,
facturar_a = CASE WHEN (cra.facturar_tipo = 'P') THEN 'Asistente'
WHEN (cra.facturar_tipo = 'E') THEN ce.razon_social_fac END,
direccion = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.direccion_emp
WHEN (cra.facturar_tipo = 'E') THEN ce.direccion_fac END,
CP = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.cp_emp WHEN
(cra.facturar_tipo = 'E') THEN ce.cp_fac END,
localidad = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.localidad_emp
WHEN (cra.facturar_tipo = 'E') THEN ce.localidad_fac END,
provincia = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.provincia_emp
WHEN (cra.facturar_tipo = 'E') THEN ce.provincia_fac END,
telefono = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.telefono_emp WHEN
(cra.facturar_tipo = 'E') THEN ce.telefono_fac END,
fax = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.fax_emp WHEN
(cra.facturar_tipo = 'E') THEN ce.fax_fac END,
NIFCIF = CASE WHEN (cra.facturar_tipo = 'P')THEN ci.nif WHEN
(cra.facturar_tipo = 'E') THEN ce.cif_nif_fac END
FROM dbo.congreso_inscripcion ci INNER JOIN
dbo.congreso_congreso cc ON ci.ID_congreso =
cc.ID_congreso INNER JOIN
dbo.congreso_registro_abono cra ON ci.ID_inscripcion =
cra.ID_inscripcion INNER JOIN
dbo.congreso_detalle_economico cde ON ci.ID_inscripcion =
cde.ID_inscripcion INNER JOIN
dbo.congreso_empresa ce ON ci.ID_inscripcion =
ce.ID_inscripcion
WHERE cde.facturar = 1 AND (cde.facturado = 0 OR
cde.facturado IS NULL)
ORDER BY ci.ID_inscripcion

que funciona OK, ahora quiero añadir otra columna tipo case:
xxx = CASE WHEN (cra.facturar_tipo = 'P')THEN ci.area WHEN
(cra.facturar_tipo = 'E') THEN ce.area_fac END

pues me dice:

Cannot resolve collation conflict for column 22 in SELECT statement.

creaia que se producia si las columnas de tablas tiene mismo nombre pero
en este caso esta bien identificadas...

PORQUE???

Gracias por su lectura...

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
01/02/2005 - 18:11 | Informe spam
Carlos,

xxx = CASE WHEN (cra.facturar_tipo = 'P')THEN ci.area WHEN
(cra.facturar_tipo = 'E') THEN ce.area_fac END



Las columnas ci.area y ce.area_fac tienen diferente collation, por eso sql
server no sabe cual de las dos cojer para el resultado de a expression case.
Puedes usar la clausula COLLATE para obligar a la expresion a que contenga
un(a) solo(a) collation.

Ejemplo:

declare @t table (
colA varchar(25) COLLATE SQL_Latin1_General_CP1_CS_AS,
colB varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AS
)

insert into @t values ('alejandro', 'mesa')

select
case when 1 = 1 then colA collate SQL_Latin1_General_CP1_CI_AS else colB end
from
@t
go


AMB


"Carlos" wrote:

Aver que esto me mata...

tengo esta consulta:

SELECT TOP 100 PERCENT cc.ID_congreso, cc.titulo, ci.ID_inscripcion,
ci.apellido1, ci.apellido2, ci.nombre AS nomb, ci.tipo, cra.forma_pago,
cra.fecha_abono, cra.importe, cra.facturar_tipo,
cde.facturar, cde.facturado,
facturar_a = CASE WHEN (cra.facturar_tipo = 'P') THEN 'Asistente'
WHEN (cra.facturar_tipo = 'E') THEN ce.razon_social_fac END,
direccion = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.direccion_emp
WHEN (cra.facturar_tipo = 'E') THEN ce.direccion_fac END,
CP = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.cp_emp WHEN
(cra.facturar_tipo = 'E') THEN ce.cp_fac END,
localidad = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.localidad_emp
WHEN (cra.facturar_tipo = 'E') THEN ce.localidad_fac END,
provincia = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.provincia_emp
WHEN (cra.facturar_tipo = 'E') THEN ce.provincia_fac END,
telefono = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.telefono_emp WHEN
(cra.facturar_tipo = 'E') THEN ce.telefono_fac END,
fax = CASE WHEN (cra.facturar_tipo = 'P') THEN ci.fax_emp WHEN
(cra.facturar_tipo = 'E') THEN ce.fax_fac END,
NIFCIF = CASE WHEN (cra.facturar_tipo = 'P')THEN ci.nif WHEN
(cra.facturar_tipo = 'E') THEN ce.cif_nif_fac END
FROM dbo.congreso_inscripcion ci INNER JOIN
dbo.congreso_congreso cc ON ci.ID_congreso =
cc.ID_congreso INNER JOIN
dbo.congreso_registro_abono cra ON ci.ID_inscripcion =
cra.ID_inscripcion INNER JOIN
dbo.congreso_detalle_economico cde ON ci.ID_inscripcion =
cde.ID_inscripcion INNER JOIN
dbo.congreso_empresa ce ON ci.ID_inscripcion =
ce.ID_inscripcion
WHERE cde.facturar = 1 AND (cde.facturado = 0 OR
cde.facturado IS NULL)
ORDER BY ci.ID_inscripcion

que funciona OK, ahora quiero añadir otra columna tipo case:
xxx = CASE WHEN (cra.facturar_tipo = 'P')THEN ci.area WHEN
(cra.facturar_tipo = 'E') THEN ce.area_fac END

pues me dice:

Cannot resolve collation conflict for column 22 in SELECT statement.

creaia que se producia si las columnas de tablas tiene mismo nombre pero
en este caso esta bien identificadas...

PORQUE???

Gracias por su lectura...

Respuesta Responder a este mensaje
#2 Carlos
01/02/2005 - 18:47 | Informe spam
OK funciona :-) , pero la pregunta del millon yo miro la base de datos
me hago un copia a script sql y resulta que las dos columnas tienen el
mismo collate.

Muy agradecido por tu respuesta, pero porque??

Alejandro Mesa escribió:
Carlos,


xxx = CASE WHEN (cra.facturar_tipo = 'P')THEN ci.area WHEN
(cra.facturar_tipo = 'E') THEN ce.area_fac END




Las columnas ci.area y ce.area_fac tienen diferente collation, por eso sql
server no sabe cual de las dos cojer para el resultado de a expression case.
Puedes usar la clausula COLLATE para obligar a la expresion a que contenga
un(a) solo(a) collation.

Ejemplo:

declare @t table (
colA varchar(25) COLLATE SQL_Latin1_General_CP1_CS_AS,
colB varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AS
)

insert into @t values ('alejandro', 'mesa')

select
case when 1 = 1 then colA collate SQL_Latin1_General_CP1_CI_AS else colB end
from
@t
go


AMB

Respuesta Responder a este mensaje
#3 Alejandro Mesa
01/02/2005 - 19:03 | Informe spam
Puedes ejecutar esta sentencia y chequear?

use nombre_base_datos
go

select
table_name,
column_name,
collation_name
from
information_schema.columns
where
table_schema = 'dbo'
and table_name in ('congreso_inscripcion', 'congreso_empresa')
and column_name in ('area', 'area_fac')


AMB


"Carlos" wrote:

OK funciona :-) , pero la pregunta del millon yo miro la base de datos
me hago un copia a script sql y resulta que las dos columnas tienen el
mismo collate.

Muy agradecido por tu respuesta, pero porque??

Alejandro Mesa escribió:
> Carlos,
>
>
>>xxx = CASE WHEN (cra.facturar_tipo = 'P')THEN ci.area WHEN
>>(cra.facturar_tipo = 'E') THEN ce.area_fac END
>
>
> Las columnas ci.area y ce.area_fac tienen diferente collation, por eso sql
> server no sabe cual de las dos cojer para el resultado de a expression case.
> Puedes usar la clausula COLLATE para obligar a la expresion a que contenga
> un(a) solo(a) collation.
>
> Ejemplo:
>
> declare @t table (
> colA varchar(25) COLLATE SQL_Latin1_General_CP1_CS_AS,
> colB varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AS
> )
>
> insert into @t values ('alejandro', 'mesa')
>
> select
> case when 1 = 1 then colA collate SQL_Latin1_General_CP1_CI_AS else colB end
> from
> @t
> go
>
>
> AMB
>

Respuesta Responder a este mensaje
#4 Carlos
02/02/2005 - 09:05 | Informe spam
OK por dos veces resulta que el script era de la base de datos en real y
yo hacia las pruebas en una copia, resulta que la copia me hace la pirula.

Mandare a paseo esto y me dedicare a criar cerdos.

muchas gracias...
Carlos

Alejandro Mesa escribió:
Puedes ejecutar esta sentencia y chequear?

use nombre_base_datos
go

select
table_name,
column_name,
collation_name
from
information_schema.columns
where
table_schema = 'dbo'
and table_name in ('congreso_inscripcion', 'congreso_empresa')
and column_name in ('area', 'area_fac')


AMB
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida