Consulta: tablas pivote ?

30/07/2009 - 17:18 por Andres L. Arias Paz | Informe spam
Hola,
Tengo el siguiente problema .. Tengo una tabla (A) con la
siguiente estructura:

IdPedido IdProveedor
100 2
100 6
101 1
101 2
102 5
102 6
102 7
...

Necesito mostrar esta información de la siguiente manera:
IdPedido P1 P2 P3
100 2 6
101 1 2
102 5 6 7

Necesito mostrar por cada pedido hasta 3 proveedores (no más). En un
principio me pidieron mostrar sólo dos proveedores y lo resolví usando
MAX() y MIN() .. pero ahora se me complica. Estoy trabajando con la
versión de SQL server 2005 y leí un poco de tablas pivote pero no
termino de resolverlo de la forma que quiero. Alguien me puede ayudar ?
Gracias,

Andres

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
30/07/2009 - 17:59 | Informe spam
No es la solución más óptima, pero es una de tantas:

; WITH prev AS (
SELECT ROW_NUMBER() OVER(PARTITION BY idPedido ORDER BY IdProveedor) AS rn
, IdPedido, IdProveedor
FROM A
)
SELECT DISTINCT a.IdPedido, p1.idProveedor as p1, p2.idProveedor as p2,
p3.idProveedor as p3
FROM prev a
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=1) p1 ON
a.idPedido=p1.idPedido
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=2) p2 ON
a.idPedido=p2.idPedido
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=3) p3 ON
a.idPedido=p3.idPedido


"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Andres L. Arias Paz" wrote in message
news:
Hola,
Tengo el siguiente problema .. Tengo una tabla (A) con la
siguiente estructura:

IdPedido IdProveedor
100 2
100 6
101 1
101 2
102 5
102 6
102 7
...

Necesito mostrar esta información de la siguiente manera:
IdPedido P1 P2 P3
100 2 6
101 1 2
102 5 6 7

Necesito mostrar por cada pedido hasta 3 proveedores (no más). En un
principio me pidieron mostrar sólo dos proveedores y lo resolví usando
MAX() y MIN() .. pero ahora se me complica. Estoy trabajando con la
versión de SQL server 2005 y leí un poco de tablas pivote pero no termino
de resolverlo de la forma que quiero. Alguien me puede ayudar ? Gracias,

Andres
Respuesta Responder a este mensaje
#2 Alejandro Mesa
30/07/2009 - 18:22 | Informe spam
Carlos,

Voy a tratar de expandir tu idea, pero usando el operador "pivot". Usar la
funcion "row_number" me parece excelente para seleccionar hasta tres
proveedores por pedido.

WITH prev AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY idPedido ORDER BY IdProveedor) AS rn
IdPedido, IdProveedor
FROM
A
)
select
IdPedido,
[1] as P1,
[2] as P2,
[3] as P3
from
(select rn, IdPedido, IdProveedor from prev where rn <= 3) as T
pivot
(
MAX(IdProveedor)
FOR rn in ([1], [2], [3])
) as pvt
order by
IdPedido;
GO


AMB


"Carlos Sacristan" wrote:

No es la solución más óptima, pero es una de tantas:

; WITH prev AS (
SELECT ROW_NUMBER() OVER(PARTITION BY idPedido ORDER BY IdProveedor) AS rn
, IdPedido, IdProveedor
FROM A
)
SELECT DISTINCT a.IdPedido, p1.idProveedor as p1, p2.idProveedor as p2,
p3.idProveedor as p3
FROM prev a
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=1) p1 ON
a.idPedido=p1.idPedido
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=2) p2 ON
a.idPedido=p2.idPedido
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=3) p3 ON
a.idPedido=p3.idPedido


"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Andres L. Arias Paz" wrote in message
news:
> Hola,
> Tengo el siguiente problema .. Tengo una tabla (A) con la
> siguiente estructura:
>
> IdPedido IdProveedor
> 100 2
> 100 6
> 101 1
> 101 2
> 102 5
> 102 6
> 102 7
> ...
>
> Necesito mostrar esta información de la siguiente manera:
> IdPedido P1 P2 P3
> 100 2 6
> 101 1 2
> 102 5 6 7
>
> Necesito mostrar por cada pedido hasta 3 proveedores (no más). En un
> principio me pidieron mostrar sólo dos proveedores y lo resolví usando
> MAX() y MIN() .. pero ahora se me complica. Estoy trabajando con la
> versión de SQL server 2005 y leí un poco de tablas pivote pero no termino
> de resolverlo de la forma que quiero. Alguien me puede ayudar ? Gracias,
>
> Andres


Respuesta Responder a este mensaje
#3 Carlos Sacristan
30/07/2009 - 18:44 | Informe spam
Lo dicho, que eficiente mi solución no era. Mucho mejor tu versión,
Alejandro. Menos mal que estás ahí para arreglar entuertos ;-)

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Alejandro Mesa" wrote in message
news:
Carlos,

Voy a tratar de expandir tu idea, pero usando el operador "pivot". Usar la
funcion "row_number" me parece excelente para seleccionar hasta tres
proveedores por pedido.

WITH prev AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY idPedido ORDER BY IdProveedor) AS rn
IdPedido, IdProveedor
FROM
A
)
select
IdPedido,
[1] as P1,
[2] as P2,
[3] as P3
from
(select rn, IdPedido, IdProveedor from prev where rn <= 3) as T
pivot
(
MAX(IdProveedor)
FOR rn in ([1], [2], [3])
) as pvt
order by
IdPedido;
GO


AMB


"Carlos Sacristan" wrote:

No es la solución más óptima, pero es una de tantas:

; WITH prev AS (
SELECT ROW_NUMBER() OVER(PARTITION BY idPedido ORDER BY IdProveedor) AS
rn
, IdPedido, IdProveedor
FROM A
)
SELECT DISTINCT a.IdPedido, p1.idProveedor as p1, p2.idProveedor as p2,
p3.idProveedor as p3
FROM prev a
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=1) p1 ON
a.idPedido=p1.idPedido
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=2) p2 ON
a.idPedido=p2.idPedido
LEFT JOIN (SELECT IdPedido, IdProveedor FROM prev WHERE rn=3) p3 ON
a.idPedido=p3.idPedido


"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Andres L. Arias Paz" wrote in message
news:
> Hola,
> Tengo el siguiente problema .. Tengo una tabla (A) con la
> siguiente estructura:
>
> IdPedido IdProveedor
> 100 2
> 100 6
> 101 1
> 101 2
> 102 5
> 102 6
> 102 7
> ...
>
> Necesito mostrar esta información de la siguiente manera:
> IdPedido P1 P2 P3
> 100 2 6
> 101 1 2
> 102 5 6 7
>
> Necesito mostrar por cada pedido hasta 3 proveedores (no más). En un
> principio me pidieron mostrar sólo dos proveedores y lo resolví usando
> MAX() y MIN() .. pero ahora se me complica. Estoy trabajando con la
> versión de SQL server 2005 y leí un poco de tablas pivote pero no
> termino
> de resolverlo de la forma que quiero. Alguien me puede ayudar ?
> Gracias,
>
> Andres


Respuesta Responder a este mensaje
#4 Andres L. Arias Paz
03/08/2009 - 22:50 | Informe spam
Carlos Sacristan escribió:
Lo dicho, que eficiente mi solución no era. Mucho mejor tu versión,
Alejandro. Menos mal que estás ahí para arreglar entuertos ;-)



Muchas gracias por la respuesta Alejandro y Carlos. Había tomado la idea
de Alejandro (original lo de del row_number() ... no se me hubiese
ocurrido nunca...) y sólo agregué un distinct para funcionara como yo lo
quería.
Ahora veo tu planteo Carlos, interesante también.
Saludos,

Andres
Respuesta Responder a este mensaje
#5 Carlos Sacristan
04/08/2009 - 09:48 | Informe spam
Te recomiendo directamente la de Alejandro. Mi opción requiere cuatro
escaneos de la tabla (o de índice si existe alguno útil), mientras que la de
Alejandro lo hace en una única pasada. Mucho más eficiente.

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Andres L. Arias Paz" wrote in message
news:
Carlos Sacristan escribió:
Lo dicho, que eficiente mi solución no era. Mucho mejor tu versión,
Alejandro. Menos mal que estás ahí para arreglar entuertos ;-)



Muchas gracias por la respuesta Alejandro y Carlos. Había tomado la idea
de Alejandro (original lo de del row_number() ... no se me hubiese
ocurrido nunca...) y sólo agregué un distinct para funcionara como yo lo
quería.
Ahora veo tu planteo Carlos, interesante también.
Saludos,

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