>Server sql 2005
OK.
Osserva il seguente esempio:
USE tempdb;
CREATE TABLE dbo.fraglist (
Intero int NOT NULL,
CodPro varchar (50) NOT NULL,
Modulo varchar (9) NULL,
Modulo2 varchar (9) NULL,
Modulo3 varchar (9) NULL,
Modulo4 varchar (9)
);
CREATE TABLE dbo.Origine(
Intero int NOT NULL,
CodPro varchar (50) NOT NULL,
Modulo varchar (9) NOT NULL
);
INSERT dbo.Origine VALUES(1, '001690', '0224');
INSERT dbo.Origine VALUES(1, '001690', 'L0224');
INSERT dbo.fraglist
SELECT
Intero
, CodPro
, [1]
, [2]
, [3]
, [4]
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY Intero, CodPro ORDER BY Intero, CodPro) AS Col
FROM dbo.Origine
) AS Sorgente
PIVOT (
MAX(Modulo)
FOR Col IN ([1], [2], [3], [4])
) AS PivotTable;
SELECT *
FROM dbo.fraglist;
/* Output:
Intero CodPro Modulo Modulo2 Modulo3 Modulo4
----------- ------- --------- --------- --------- ---------
1 001690 0224 L0224 NULL NULL
(1 row(s) affected)
*/
DROP TABLE dbo.Origine, dbo.fraglist;
Come prima cosa ho scritto un comando di SELECT che mi restituisce le colonne Intero, CodPro, Modulo ed una quarta colonna con un progressivo numerico per Intero e CodPro ottenuta mediante la funzione di ranking ROW_NUMBER().
A questo punto utilizzo l'operatore PIVOT per scrivere una seconda query di INSERT che "ribalta" le righe in colonne in base al progressivo numerico calcolato in precedenza.
Per ogni ulteriore dettaglio consulta i Books Online.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org