Consulta

10/03/2009 - 22:57 por Alexander Cadavid | Informe spam
Buenas Tardes.

Muchas gracias.

Tengo una consulta que me muestra estos tres campos.

Cedula Campaña Valor
01 200801 50000
01 200802 35000
02 200802 150000
03 200801 25000
03 200802 25000
04 200802 15000
05 200802 250000
01 200803 85000
02 200803 56988
03 200803 45895
04 200803 480000
05 200803 48956
01 200804 65000

Como hay cedulas que se repiten y las campañas son unicas
hay alguna forma de que me muestre esto. que la cedula siga siendo columna y
las campañas que eran datos, pueden ser tambien columnas.


Cedula 200801 200802 200803 200804

01 50000 35000 85000 65000
02 0 15000 56988
03 25000 25000
04 15000 480000
05 250000 48956
 

Leer las respuestas

#1 Alejandro Mesa
11/03/2009 - 00:19 | Informe spam
Alexander Cadavid,

- Cual version de SQL Server usas?
- Los valores de las campañas son fijos o varian?

En caso de que estes usando SQL Server 2005 / 2008, hechale un vistazo al
operador PIVOT en los BOL.

USE tempdb;
GO

CREATE TABLE dbo.t (
Cedula VARCHAR(15)NOT NULL,
Campaña CHAR(6) NOT NULL,
Valor INT NOT NULL
);
GO

SET NOCOUNT ON;
GO

INSERT INTO dbo.t VALUES('01','200801', 50000);
INSERT INTO dbo.t VALUES('01','200802', 35000);
INSERT INTO dbo.t VALUES('02','200802', 150000);
INSERT INTO dbo.t VALUES('03','200801', 25000);
INSERT INTO dbo.t VALUES('03','200802', 25000);
INSERT INTO dbo.t VALUES('04','200802', 15000);
INSERT INTO dbo.t VALUES('05','200802', 250000);
INSERT INTO dbo.t VALUES('01','200803', 85000);
INSERT INTO dbo.t VALUES('02','200803', 56988);
INSERT INTO dbo.t VALUES('03','200803', 45895);
INSERT INTO dbo.t VALUES('04','200803', 480000);
INSERT INTO dbo.t VALUES('05','200803', 48956);
INSERT INTO dbo.t VALUES('01','200804', 65000);
GO

SET NOCOUNT OFF;
GO

DECLARE @columns NVARCHAR(MAX);
DECLARE @sql NVARCHAR(MAX);

SET @columns = STUFF(
(
SELECT CAST(',' AS VARCHAR(MAX)) + QUOTENAME(Campaña)
FROM (SELECT DISTINCT Campaña FROM dbo.t) AS t
ORDER BY Campaña
FOR XML PATH('')
), 1, 1, '');

SET @sql = N'
SELECT
*
FROM
dbo.t
PIVOT
(
MIN(Valor)
FOR Campaña IN (' + @columns + N')
) as pvt
';

EXEC sp_executesql @sql;
GO

DROP TABLE dbo.t;
GO

Debes tener en cuenta que este metodo usa sql dinamico y que por lo tanto
debes tomar mucha precaucion para evitar injeccion de codigo SQL.

The Curse and Blessings of Dynamic SQL
http://www.sommarskog.se/dynamic_sql.html


AMB


"Alexander Cadavid" wrote:

Buenas Tardes.

Muchas gracias.

Tengo una consulta que me muestra estos tres campos.

Cedula Campaña Valor
01 200801 50000
01 200802 35000
02 200802 150000
03 200801 25000
03 200802 25000
04 200802 15000
05 200802 250000
01 200803 85000
02 200803 56988
03 200803 45895
04 200803 480000
05 200803 48956
01 200804 65000

Como hay cedulas que se repiten y las campañas son unicas
hay alguna forma de que me muestre esto. que la cedula siga siendo columna y
las campañas que eran datos, pueden ser tambien columnas.


Cedula 200801 200802 200803 200804

01 50000 35000 85000 65000
02 0 15000 56988
03 25000 25000
04 15000 480000
05 250000 48956





Preguntas similares