pívot doble SQL

01/08/2007 - 20:56 por Pedro | Informe spam
Hola

Megustaria saber como puedo hacer un pívot doble me explico:

Imaginemos que tenemos un tabla tal que asi:

ClaveComercial CarteraCmr Tiendas Clientes fecha
ADC-DER car22 Tiend1 Cli2 20070715
AgC-DER car23 Tiend3 Cli8 20070718
AgC-DER car23 Tiend4 Cli3 20070715
AtC-DER car24 Tiend5 Cli22 20070717
AtC-DER car24 Tiend1 Cli5 20070712
AfL-DER car25 Tiend3 Cli2 20070715
AfL-DER car25 Tiend5 Cli5 20070716
AfL-DER car25 Tiend3 Cli2 20070715

Quiero sacar algo tal que asi, con estos conceptos
Por ClaveComercial hacer un max(fecha) para sacar la ultima fecha de compra
correspondiente a cada cartera
Por ClaveComercial haer un conunt para sacar el numero de tiendas con las
que ha vendido
car22 car23 car24 car25 tienda1 tienda 3 tienda4 tienda5
ADC-DER 20070715 null null null 1 0
0 0
AgC-DER null 20070718 null null 0 1
1 0
AtC-DER null null 20070717 null 1
0 0 1
AfL-DER null null null 20070716 0
2 0 1

Tendriamos que hacer 2 pivot en uno… se que no es un buen ejemplo, pero como
se haria un pívot doble??

graicas
 

Leer las respuestas

#1 Alejandro Mesa
01/08/2007 - 23:02 | Informe spam
Hola Pedro,

Cual version de SS estas usando?

Para este tipo de preguntas es recomendable que se postee la estructura de
las tablas, data de ejemplo en forma de sentencias insert y los resultados
esperados. De esa forma no tenemos que tomar parte de nuestro tiempo para
simular el ambiente de quein hace la pregunta. La ayuda debe ser mutua, no
crees?

Debes hacer dos pivots y hacer un "full join" de ambos resultados.

create table #t (
ClaveComercial varchar(15),
CarteraCmr varchar(15),
Tiendas varchar(15),
Clientes varchar(15),
fecha datetime
)

insert into #t values('ADC-DER', 'car22', 'Tiend1', 'Cli2', '20070715')
insert into #t values('AgC-DER', 'car23', 'Tiend3', 'Cli8', '20070718')
insert into #t values('AgC-DER', 'car23', 'Tiend4', 'Cli3', '20070715')
insert into #t values('AtC-DER', 'car24', 'Tiend5', 'Cli22', '20070717')
insert into #t values('AtC-DER', 'car24', 'Tiend1', 'Cli5', '20070712')
insert into #t values('AfL-DER', 'car25', 'Tiend3', 'Cli2', '20070715')
insert into #t values('AfL-DER', 'car25', 'Tiend5', 'Cli5', '20070716')
insert into #t values('AfL-DER', 'car25', 'Tiend3', 'Cli2', '20070715')

declare @columns_1 nvarchar(max)
declare @columns_2 nvarchar(max)
declare @sql nvarchar(max)

set @columns_1 = stuff(
(
select ',' + quotename(CarteraCmr)
from
(
select distinct
CarteraCmr
from
#t
) as t1
order by CarteraCmr
for xml path('')
), 1, 1, '')

set @columns_2 = stuff(
(
select ',' + quotename(Tiendas)
from
(
select distinct
Tiendas
from
#t
) as t1
order by Tiendas
for xml path('')
), 1, 1, '')

set @sql = N'
select
coalesce(t1.ClaveComercial, t2.ClaveComercial) as ClaveComercial,
' + @columns_1 + N',' + @columns_2 + N'
from
(
select *
from
(
select
ClaveComercial,
CarteraCmr,
fecha
from
#t
) as a
pivot
(
max(fecha)
for CarteraCmr in (' + @columns_1 + N')) as pvt
) as t1' + N' full join
(
select *
from
(
select
ClaveComercial,
Tiendas,
1 as cnt
from
#t
) as a
pivot
(
sum(cnt)
for Tiendas in (' + @columns_2 + N')) as pvt
) as t2
on t1.ClaveComercial = t2.ClaveComercial'

exec sp_executesql @sql

drop table #t
go

Mucho cuidado con la inyeccion de codigo T-SQL, ya que estamos usando sql
dinamico.

AMB


"Pedro" wrote:

Hola

Megustaria saber como puedo hacer un pívot doble me explico:

Imaginemos que tenemos un tabla tal que asi:

ClaveComercial CarteraCmr Tiendas Clientes fecha
ADC-DER car22 Tiend1 Cli2 20070715
AgC-DER car23 Tiend3 Cli8 20070718
AgC-DER car23 Tiend4 Cli3 20070715
AtC-DER car24 Tiend5 Cli22 20070717
AtC-DER car24 Tiend1 Cli5 20070712
AfL-DER car25 Tiend3 Cli2 20070715
AfL-DER car25 Tiend5 Cli5 20070716
AfL-DER car25 Tiend3 Cli2 20070715

Quiero sacar algo tal que asi, con estos conceptos
Por ClaveComercial hacer un max(fecha) para sacar la ultima fecha de compra
correspondiente a cada cartera
Por ClaveComercial haer un conunt para sacar el numero de tiendas con las
que ha vendido
car22 car23 car24 car25 tienda1 tienda 3 tienda4 tienda5
ADC-DER 20070715 null null null 1 0
0 0
AgC-DER null 20070718 null null 0 1
1 0
AtC-DER null null 20070717 null 1
0 0 1
AfL-DER null null null 20070716 0
2 0 1

Tendriamos que hacer 2 pivot en uno… se que no es un buen ejemplo, pero como
se haria un pívot doble??

graicas

Preguntas similares