Creacion_Consulta

11/03/2009 - 21:17 por ronhi | Informe spam
Saludos Equipo,

Tengo una tabla cuyua informacion se ve reflejada de la siguiente forma:

ID_Producto Producto SEM1 SEM2 SEM3
1 Mesa 1500 1600 1800
2 Carro 1512 1356 1568

deseo hacer una tabla nueva en base a estos campos que me quede como
resultado la siguiente tabla:

ID_Producto Producto Periodo Monto
1 Mesa 1 1500
1 Mesa 1 1600
1 Mesa 1 1800
2 Carro 2 1512
2 Carro 2 1536
2 Carro 2 1568

o que me recomiendan hacer?

Saludos

Preguntas similare

Leer las respuestas

#1 Alexander Cadavid
11/03/2009 - 21:26 | Informe spam
Buenas Tardes.

Mira con el comando pivot de sql server 2005/2008, se pueden convertir filas
en columnas.

que version tienes.

"ronhi" escribió en el mensaje
news:
Saludos Equipo,

Tengo una tabla cuyua informacion se ve reflejada de la siguiente forma:

ID_Producto Producto SEM1 SEM2 SEM3
1 Mesa 1500 1600 1800
2 Carro 1512 1356 1568

deseo hacer una tabla nueva en base a estos campos que me quede como
resultado la siguiente tabla:

ID_Producto Producto Periodo Monto
1 Mesa 1 1500
1 Mesa 1 1600
1 Mesa 1 1800
2 Carro 2 1512
2 Carro 2 1536
2 Carro 2 1568

o que me recomiendan hacer?

Saludos
Respuesta Responder a este mensaje
#2 ronhi
12/03/2009 - 01:09 | Informe spam
Hola Alex la version de SQL es 2005 pero la Instancia de BD esta en 2000.
Intente hacer lo que me dijiste pero me envia error.

"Alexander Cadavid" wrote:

Buenas Tardes.

Mira con el comando pivot de sql server 2005/2008, se pueden convertir filas
en columnas.

que version tienes.

"ronhi" escribió en el mensaje
news:
> Saludos Equipo,
>
> Tengo una tabla cuyua informacion se ve reflejada de la siguiente forma:
>
> ID_Producto Producto SEM1 SEM2 SEM3
> 1 Mesa 1500 1600 1800
> 2 Carro 1512 1356 1568
>
> deseo hacer una tabla nueva en base a estos campos que me quede como
> resultado la siguiente tabla:
>
> ID_Producto Producto Periodo Monto
> 1 Mesa 1 1500
> 1 Mesa 1 1600
> 1 Mesa 1 1800
> 2 Carro 2 1512
> 2 Carro 2 1536
> 2 Carro 2 1568
>
> o que me recomiendan hacer?
>
> Saludos



Respuesta Responder a este mensaje
#3 Alejandro Mesa
12/03/2009 - 01:21 | Informe spam
ronhi,

Lo que tratas de hacer es normalizar la tabla. Si usas SQL Server 2005 /
2008, puedes mirar el operador UNPIVOT en los BOL, de lo contrario tendras
que usar otros metodos como uso de "union all" o "cross join".

CREATE TABLE t (
ID_Producto INT NOT NULL,
Producto VARCHAR(50) NOT NULL,
SEM1 INT,
SEM2 INT,
SEM3 INT
);
GO

INSERT INTO t VALUES(1,'Mesa',1500,1600,1800);
INSERT INTO t VALUES(2,'Carro',1512,1356,1568);
GO

SELECT
t.ID_Producto,
t.Producto,
CASE a.c1
WHEN 1 THEN 'SEM1'
WHEN 2 THEN 'SEM2'
WHEN 3 THEN 'SEM3'
END AS Periodo,
CASE a.c1
WHEN 1 THEN t.SEM1
WHEN 2 THEN t.SEM2
WHEN 3 THEN t.SEM3
END AS Monto
FROM
t
CROSS JOIN
(SELECT 1 AS c1 UNION ALL SELECT 2 UNION ALL SELECT 3) AS a;
GO

SELECT
ID_Producto,
Producto,
'SEM1' AS Periodo,
SEM1 AS Monto
FROM
t

UNION ALL

SELECT
ID_Producto,
Producto,
'SEM2' AS Periodo,
SEM2 AS Monto
FROM
t

UNION ALL

SELECT
ID_Producto,
Producto,
'SEM3' AS Periodo,
SEM3 AS Monto
FROM
t;
GO

SELECT
ID_Producto,
Producto,
Periodo,
Monto
FROM
t
UNPIVOT
(
Monto
FOR Periodo IN ([SEM1], [SEM2], [SEM3])
) AS unpvt;
GO

DROP TABLE t;
GO


No se la logica que usas para asignar un numero a la columna [Periodo]. Si
la explicas, posiblemente se podra incluir alguna solucion junto con los
ejemplos ajuntados.


AMB

"ronhi" wrote:

Saludos Equipo,

Tengo una tabla cuyua informacion se ve reflejada de la siguiente forma:

ID_Producto Producto SEM1 SEM2 SEM3
1 Mesa 1500 1600 1800
2 Carro 1512 1356 1568

deseo hacer una tabla nueva en base a estos campos que me quede como
resultado la siguiente tabla:

ID_Producto Producto Periodo Monto
1 Mesa 1 1500
1 Mesa 1 1600
1 Mesa 1 1800
2 Carro 2 1512
2 Carro 2 1536
2 Carro 2 1568

o que me recomiendan hacer?

Saludos
Respuesta Responder a este mensaje
#4 ronhi
12/03/2009 - 19:47 | Informe spam
De antemano muchas gracias, la información proporcionada me fue de mucha ayuda.

"Alejandro Mesa" wrote:

ronhi,

Lo que tratas de hacer es normalizar la tabla. Si usas SQL Server 2005 /
2008, puedes mirar el operador UNPIVOT en los BOL, de lo contrario tendras
que usar otros metodos como uso de "union all" o "cross join".

CREATE TABLE t (
ID_Producto INT NOT NULL,
Producto VARCHAR(50) NOT NULL,
SEM1 INT,
SEM2 INT,
SEM3 INT
);
GO

INSERT INTO t VALUES(1,'Mesa',1500,1600,1800);
INSERT INTO t VALUES(2,'Carro',1512,1356,1568);
GO

SELECT
t.ID_Producto,
t.Producto,
CASE a.c1
WHEN 1 THEN 'SEM1'
WHEN 2 THEN 'SEM2'
WHEN 3 THEN 'SEM3'
END AS Periodo,
CASE a.c1
WHEN 1 THEN t.SEM1
WHEN 2 THEN t.SEM2
WHEN 3 THEN t.SEM3
END AS Monto
FROM
t
CROSS JOIN
(SELECT 1 AS c1 UNION ALL SELECT 2 UNION ALL SELECT 3) AS a;
GO

SELECT
ID_Producto,
Producto,
'SEM1' AS Periodo,
SEM1 AS Monto
FROM
t

UNION ALL

SELECT
ID_Producto,
Producto,
'SEM2' AS Periodo,
SEM2 AS Monto
FROM
t

UNION ALL

SELECT
ID_Producto,
Producto,
'SEM3' AS Periodo,
SEM3 AS Monto
FROM
t;
GO

SELECT
ID_Producto,
Producto,
Periodo,
Monto
FROM
t
UNPIVOT
(
Monto
FOR Periodo IN ([SEM1], [SEM2], [SEM3])
) AS unpvt;
GO

DROP TABLE t;
GO


No se la logica que usas para asignar un numero a la columna [Periodo]. Si
la explicas, posiblemente se podra incluir alguna solucion junto con los
ejemplos ajuntados.


AMB

"ronhi" wrote:

> Saludos Equipo,
>
> Tengo una tabla cuyua informacion se ve reflejada de la siguiente forma:
>
> ID_Producto Producto SEM1 SEM2 SEM3
> 1 Mesa 1500 1600 1800
> 2 Carro 1512 1356 1568
>
> deseo hacer una tabla nueva en base a estos campos que me quede como
> resultado la siguiente tabla:
>
> ID_Producto Producto Periodo Monto
> 1 Mesa 1 1500
> 1 Mesa 1 1600
> 1 Mesa 1 1800
> 2 Carro 2 1512
> 2 Carro 2 1536
> 2 Carro 2 1568
>
> o que me recomiendan hacer?
>
> Saludos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida