Sql con Group by algo dificil

12/04/2006 - 22:15 por Mauricio Pulla | Informe spam
Tengo las siguientes tablas.
Tabla: OPC
cOPId c(10) 6 caracteres numero de OP, 4 Numero de repeticion de OP

cOPId tFecha cDescripcion C(100) iIdCliente
5612 1 01-01-2006 Caja x 1
5612 2 01-02-2006 Caja xx 1
5612 3 01-03-2006 Caja xxx 1
<--
5620 1 01-02-2006 Caja zz 1
5620 2 01-03-2006 Caja zzz 1
<--

Tabla Cliente
iClienteId cNombre
1 Juan

Resultado deseado
cOP Fecha Descripcion
5612 3 01-03-2006 Caja xxx
5620 2 01-02-2006 Caja zzz
Necesito el registro de mayor valor agrupado por los 6 primeros digitos de
cOP

Intente con:
SELECT max(OPC.cOPId) As cOPId, OPC.tFecha, OPC.cDescripcion
FROM Cliente INNER JOIN OPC ON Cliente.iClienteId = OPC.iIdCliente
Where Cliente.iClienteId = 1
Group by SubString(OPC.cOPId, 1, 6), OPC.tFecha, OPC.cDescripcion

Pero al agruparlo por SubString(OPC.cOPId, 1, 6), OPC.tFecha,
OPC.cDescripcion, me retorna mas registros por el cambio de fecha y
descripcion.

Alguna sugerencia para conseguir este objetivo, gracias.

Saludos.
Mauricio Pulla.
Cuenca-Ecuador
 

Leer las respuestas

#1 Alejandro Mesa
13/04/2006 - 01:26 | Informe spam
Mauricio,

No es una buena idea usar ese tipo de codificacion en bases de datos
relacionales. Tarde o temprano nos veremos manipulando la columna para poder
extraer lo que necesitamos y eso atentara contra el rendimiento de sql server
al no poder usar correctamente los indices en caso de que estos existan por
esa columna.

select *
from dbo.opc as a
where not exists(
select *
from dbo.opc as b
where left(b.copcid, 4) = left(a.copcid, 4)
and cast(ltrim(rtrim(right(b.copcid, 2))) as int) >
cast(ltrim(rtrim(right(a.copcid, 2))) as int)
)
go

Como ves, esta sentencia requiere manipulacion de la columna copcid. Fijate
como seria en caso de que esta informacion estuviese almacenada en dos
columnas.

select *
from dbo.opc as a
where not exists(
select *
from dbo.opc as b
where b.copcid = a.copcid
and b.repeticion > a.repeticion
)
go


AMB

"Mauricio Pulla" wrote:

Tengo las siguientes tablas.
Tabla: OPC
cOPId c(10) 6 caracteres numero de OP, 4 Numero de repeticion de OP

cOPId tFecha cDescripcion C(100) iIdCliente
5612 1 01-01-2006 Caja x 1
5612 2 01-02-2006 Caja xx 1
5612 3 01-03-2006 Caja xxx 1
<--
5620 1 01-02-2006 Caja zz 1
5620 2 01-03-2006 Caja zzz 1
<--

Tabla Cliente
iClienteId cNombre
1 Juan

Resultado deseado
cOP Fecha Descripcion
5612 3 01-03-2006 Caja xxx
5620 2 01-02-2006 Caja zzz
Necesito el registro de mayor valor agrupado por los 6 primeros digitos de
cOP

Intente con:
SELECT max(OPC.cOPId) As cOPId, OPC.tFecha, OPC.cDescripcion
FROM Cliente INNER JOIN OPC ON Cliente.iClienteId = OPC.iIdCliente
Where Cliente.iClienteId = 1
Group by SubString(OPC.cOPId, 1, 6), OPC.tFecha, OPC.cDescripcion

Pero al agruparlo por SubString(OPC.cOPId, 1, 6), OPC.tFecha,
OPC.cDescripcion, me retorna mas registros por el cambio de fecha y
descripcion.

Alguna sugerencia para conseguir este objetivo, gracias.

Saludos.
Mauricio Pulla.
Cuenca-Ecuador



Preguntas similares