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

Preguntas similare

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



Respuesta Responder a este mensaje
#2 Mauricio Pulla
13/04/2006 - 19:10 | Informe spam
Hola Alejandro.

Esta la codificacion ' 6845 1' es solo para que los vea el suario
internamente manejo campo entero que identifica a la OP, me toca anexar un
par de campos mas a la tabla, para almacenar los datos en la forma que
deberia ser, el hecho de estar asi es por pedido de el usuario.

Pruebo tus sugerencias y te aviso.

Agradesco mucho tu ayuda y tiempo.

Saludos.
Mauricio Pulla.
Cuenca-Ecuador

"Alejandro Mesa" escribió en el
mensaje news:
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
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida