Portare i risultati di righe in colonna

martedì 17 marzo 2009 - 16.44

perla0279 Profilo | Senior Member

Ciao

sto cercando di fare un'estrazione.

Da questa estrazione per un codice x mi possono tornare più righe.
Io dovrei inserire un valore Mod di queste righe all'interno di una tabella (attraverso un insert) il colonne distinte.

Ci stò provando da un sacco ma non mi riesce in nessuna maniera...... :-(

lbenaglia Profilo | Guru

>sto cercando di fare un'estrazione.
>
>Da questa estrazione per un codice x mi possono tornare più righe.
>Io dovrei inserire un valore Mod di queste righe all'interno
>di una tabella (attraverso un insert) il colonne distinte.

Ciao Elena,

Che DBMS utilizzi?
Puoi postare un esempio completo con la struttura delle tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il risultato che intendi ottenere con quei dati?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

perla0279 Profilo | Senior Member

Server sql 2005

CREATE TABLE #fraglist (
Intero int ,
CodPro varchar (50),
Modulo varchar (9),
Modulo2 varchar (9),
Modulo3 varchar (9),
Modulo4 varchar (9)
)

qui dentro devo inserire i risultati di una select simile a questa
1 001690 0224
1 001690 L0224

Lo stesso intero e lo stesso codice possono avere + moduli dovrebbe venire fuori così alla fine

Intero = 1
CodPro =001690
Modulo = 0224
Modulo2 = L0224
Modulo3 =
Modulo4 =

tenendo presente che posso avere fino a 4 varianti



lbenaglia Profilo | Guru

>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
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5