agrupar hasta 3 registros en 1

24/07/2006 - 12:11 por ***Joselitux*** | Informe spam
Hola a todos

Tengo una aplicación que guarda los datos personales de un cliente en hasta
tres registros consecutivos con un mismo número de cliente. (No lo hice yo,
por si acaso lo piensan). Y ahora tengo que programar algunas cositas
añadidas pero necesito una vista que me muestre los datos del cliente en
solo un registro y no en tres, como hace ahora. Lo curioso es que cada
cliente puede tener 1, 2 o 3 registros como máximo (mínimo 1 y máximo 3)

Al anterior programador habría que colgarlo de los pulgares. La tabla que
tengo es esta:


ID_TABLA NUMERO_CLIENTE DATO_CLIENTE
34 2 Jose
antonio
35 2
Martinez Campos
36 2 Comercial
Seguros
37 5 Pedro
Javier
38 5 Tecnico
Electricista
...


La vista que pretendo mostraría los datos de la siguiente manera:

ID_TABLA NUMERO CLIENTE DATO1 DATO2
DATO3
34 2 Jose
antonio martinez campos Comercial seguros



Llevo un tiempo loco con el tema pero ninguna aproximación resulta. ¿alguna
idea?

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
24/07/2006 - 15:45 | Informe spam
Trata:

select
min(ID_TABLA) as ID_TABLA,
NUMERO_CLIENTE,
max(case when rank = 1 then DATO_CLIENTE end) as DATO1,
max(case when rank = 2 then DATO_CLIENTE end) as DATO2,
max(case when rank = 3 then DATO_CLIENTE end) as DATO3
from
(
select a.NUMERO_CLIENTE, a.ID_TABLA, a.DATO_CLIENTE, count(*) as rank
from
dbo.t1 as a inner join dbo.t1 as b
on b.NUMERO_CLIENTE = a.NUMERO_CLIENTE
and b.ID_TABLA <= a.ID_TABLA
group by
a.NUMERO_CLIENTE, a.ID_TABLA, a.DATO_CLIENTE
) as t
group by
NUMERO_CLIENTE
go


AMB


"***Joselitux***" wrote:

Hola a todos

Tengo una aplicación que guarda los datos personales de un cliente en hasta
tres registros consecutivos con un mismo número de cliente. (No lo hice yo,
por si acaso lo piensan). Y ahora tengo que programar algunas cositas
añadidas pero necesito una vista que me muestre los datos del cliente en
solo un registro y no en tres, como hace ahora. Lo curioso es que cada
cliente puede tener 1, 2 o 3 registros como máximo (mínimo 1 y máximo 3)

Al anterior programador habría que colgarlo de los pulgares. La tabla que
tengo es esta:


ID_TABLA NUMERO_CLIENTE DATO_CLIENTE
34 2 Jose
antonio
35 2
Martinez Campos
36 2 Comercial
Seguros
37 5 Pedro
Javier
38 5 Tecnico
Electricista



La vista que pretendo mostraría los datos de la siguiente manera:

ID_TABLA NUMERO CLIENTE DATO1 DATO2
DATO3
34 2 Jose
antonio martinez campos Comercial seguros



Llevo un tiempo loco con el tema pero ninguna aproximación resulta. ¿alguna
idea?





Respuesta Responder a este mensaje
#2 Miguel Egea
24/07/2006 - 15:48 | Informe spam
bueno, si incluyes el script completo igual te ayudamos, de momento si
tienes los 3 registros esta query te devolvería el dato, no funcionaría si
son opcionales, habría que cambiar los inners joins por left joins, pero
además habría que hacer alguna correción adicional,

Modelo SQL2000 compatible, pero todos obligatorios

create table #t (id int identity(1,1) primary key , idcliente int, masdatos
varchar(10))

insert into #t (idcliente,masdatos)
select 1,'a' union all
select 1,'b' union all
select 1,'c' union all
select 2,'a' union all
select 2,'b' union all
select 2,'c'
go
select * from (
select a.id,a2.id id2,a.idcliente,a.masdatos,a2.masdatos masdatosb from
#t a
inner join #t a2 on a.idcliente¢.idcliente and a.id>a2.id
) a3
inner join #t a4
on a4.idcliente£.idcliente and a4.id>a3.id and a4.id>a3.id2

Modelo SQLServer 2005 compatible sin obligatorios, no se como irŽŽia de
rendimiento.

create table #t (id int identity(1,1) primary key , idcliente int, masdatos
varchar(10))

insert into #t (idcliente,masdatos)
select 1,'a' union all
select 1,'b' union all
select 1,'c' union all
select 2,'a' union all
select 2,'b' union all
select 2,'c'
go
select * from (
select a.id,a2.id id2,a.idcliente,a.masdatos,a2.masdatos masdatosb from
#t a
inner join #t a2 on a.idcliente¢.idcliente and a.id>a2.id
) a3
inner join #t a4
on a4.idcliente£.idcliente and a4.id>a3.id and a4.id>a3.id2

go

insert into #t (idcliente,masdatos)
select 3,'a' union all
select 3,'b' union all
select 4,'a' union all
select 5,'b'
go
with cte as
(select *,rank() over(partition by idcliente order by id) Orden from #t )
select cte1.idcliente,cte1.masdatos,cte2.masdatos,cte3.masdatos from
(select * from cte where orden=1) cte1
left join (select * from cte where orden=2) cte2
on cte1.idcliente=cte2.idcliente
left join (select * from cte where orden=3) cte3
on cte1.idcliente=cte3.idcliente and cte2.idcliente=cte3.idcliente
;


Saludos
Miguel Egea



Saludos
Miguel Egea
"***Joselitux***" wrote in message
news:
Hola a todos

Tengo una aplicación que guarda los datos personales de un cliente en
hasta tres registros consecutivos con un mismo número de cliente. (No lo
hice yo, por si acaso lo piensan). Y ahora tengo que programar algunas
cositas añadidas pero necesito una vista que me muestre los datos del
cliente en solo un registro y no en tres, como hace ahora. Lo curioso es
que cada cliente puede tener 1, 2 o 3 registros como máximo (mínimo 1 y
máximo 3)

Al anterior programador habría que colgarlo de los pulgares. La tabla que
tengo es esta:


ID_TABLA NUMERO_CLIENTE DATO_CLIENTE
34 2 Jose
antonio
35 2 Martinez Campos
36 2
Comercial Seguros
37 5 Pedro
Javier
38 5 Tecnico
Electricista
...


La vista que pretendo mostraría los datos de la siguiente manera:

ID_TABLA NUMERO CLIENTE DATO1 DATO2 DATO3
34 2
Jose antonio martinez campos Comercial seguros



Llevo un tiempo loco con el tema pero ninguna aproximación resulta.
¿alguna idea?




Respuesta Responder a este mensaje
#3 ***Joselitux***
26/07/2006 - 14:41 | Informe spam
Perfecto, funciona..
Gracias


"Alejandro Mesa" escribió en el
mensaje news:
Trata:

select
min(ID_TABLA) as ID_TABLA,
NUMERO_CLIENTE,
max(case when rank = 1 then DATO_CLIENTE end) as DATO1,
max(case when rank = 2 then DATO_CLIENTE end) as DATO2,
max(case when rank = 3 then DATO_CLIENTE end) as DATO3
from
(
select a.NUMERO_CLIENTE, a.ID_TABLA, a.DATO_CLIENTE, count(*) as rank
from
dbo.t1 as a inner join dbo.t1 as b
on b.NUMERO_CLIENTE = a.NUMERO_CLIENTE
and b.ID_TABLA <= a.ID_TABLA
group by
a.NUMERO_CLIENTE, a.ID_TABLA, a.DATO_CLIENTE
) as t
group by
NUMERO_CLIENTE
go


AMB


"***Joselitux***" wrote:

Hola a todos

Tengo una aplicación que guarda los datos personales de un cliente en
hasta
tres registros consecutivos con un mismo número de cliente. (No lo hice
yo,
por si acaso lo piensan). Y ahora tengo que programar algunas cositas
añadidas pero necesito una vista que me muestre los datos del cliente en
solo un registro y no en tres, como hace ahora. Lo curioso es que cada
cliente puede tener 1, 2 o 3 registros como máximo (mínimo 1 y máximo 3)

Al anterior programador habría que colgarlo de los pulgares. La tabla que
tengo es esta:


ID_TABLA NUMERO_CLIENTE DATO_CLIENTE
34 2 Jose
antonio
35 2
Martinez Campos
36 2
Comercial
Seguros
37 5 Pedro
Javier
38 5
Tecnico
Electricista



La vista que pretendo mostraría los datos de la siguiente manera:

ID_TABLA NUMERO CLIENTE DATO1 DATO2
DATO3
34 2
Jose
antonio martinez campos Comercial seguros



Llevo un tiempo loco con el tema pero ninguna aproximación resulta.
¿alguna
idea?





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