Sql Server 2008 - Operatore PIVOT

mercoledì 09 dicembre 2009 - 14.50

allforum Profilo | Junior Member

Buongiorno a tutti, avrei il seguente problema:

Data la seguente tabella in input di esempio .....

ID Dati
1 A
1 B
1 D
1 E
2 B
2 C
2 D
4 A
4 B
5 F
5 G
5 H

... ecc. ecc.

dovrei costruire una query che mi restituisca il seguente risultato:

ID Dati1 Dati2 Dati3 Dati4 ...... DatiN
1 A B D E
2 B C D
4 A B
5 G H


Avrei pensato di utilizzare L'operatore PIVOT ma, sinceramente, anche studiandomi la documentazione e i vari esempi trovati su internet, proprio non ci sono riuscito.
Preciso che nel risultato potrei definire anche un numero prestabilito di colonne .... diciamo, ad esempio fino a "Dati9".
Un aiutino ? (spero di essermi spiegato a sufficienza).
Ciao.

lbenaglia Profilo | Guru

>dovrei costruire una query che mi restituisca il seguente risultato:
>
>ID Dati1 Dati2 Dati3 Dati4 ...... DatiN
>1 A B D E
>2 B C D
>4 A B
>5 G H
>
>
>Avrei pensato di utilizzare L'operatore PIVOT ma, sinceramente,
>anche studiandomi la documentazione e i vari esempi trovati su
>internet, proprio non ci sono riuscito.
Mmmmm... quello che puoi ottenere con l'operatore PIVOT è questo:

USE tempdb; CREATE TABLE dbo.foo( ID int NOT NULL, Dati char(1) NOT NULL ); INSERT dbo.foo VALUES (1, 'A'), (1, 'B'), (1, 'D'), (1, 'E') , (2, 'B'), (2, 'C'), (2, 'D'), (4, 'A') , (4, 'B'), (5, 'F'), (5, 'G'), (5, 'H'); SELECT ID, [A] AS Dati1, [B] AS Dati2, [C] AS Dati3 , [D] AS Dati4, [E] AS Dati5, [F] AS Dati6 , [G] AS Dati7, [H] AS Dati8 FROM dbo.foo PIVOT (MAX(Dati) FOR Dati IN ([A], [B], [C], [D], [E], [F], [G], [H])) AS pvt ORDER BY ID; /* Output: ID Dati1 Dati2 Dati3 Dati4 Dati5 Dati6 Dati7 Dati8 ----------- ----- ----- ----- ----- ----- ----- ----- ----- 1 A B NULL D E NULL NULL NULL 2 NULL B C D NULL NULL NULL NULL 4 A B NULL NULL NULL NULL NULL NULL 5 NULL NULL NULL NULL NULL F G H (4 row(s) affected) */ DROP TABLE dbo.foo;

Se vuoi "shiftare" i dati eliminando le colonne NULL dovresti giocare di COALESCE()...

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

allforum Profilo | Junior Member

.. per semplificare l'esempio ho utilizzato A,B,C, ecc. ecc. ma in effetti al loro posto ho una colonna con ore:min e quindi una gran quantità di valori diversi fra loro.
Le colonne Dati1, Dati2, ecc. ecc. andrebbero valorizzate partendo da SX verso Dx senza lasciare "vuoti".
COALESCE() , anche se potesse essere utile, non l'ho mai utilizzato

Riprendendo il tuo esempio; mettiamo che in input ho una tabella tipo questa:

USE tempdb; CREATE TABLE dbo.foo(ID int NOT NULL,Dati char(5) NOT NULL); INSERT dbo.foo VALUES (1, '07:30'), (1, '14:00'), (1, '15:00'), (1, '18:30') , (2, '07:20'), (2, '13:55'), (2, '15:00') , (4, '07:35'), (4, '14:10') , (5, '07:40'), (5, '14:00'), (5, '15:00'); select * from dbo.foo; DROP TABLE dbo.foo;

vorrei ottenere il seguente output:

ID Dati1 Dati2 Dati3 Dati4 Dati5 Dati6 Dati7 Dati8 ----------- ----- ----- ----- ----- ----- ----- ----- ----- 1 07:30 14:00 15:00 18:30 2 07:20 13:55 15:00 4 07:35 14:10 5 07:40 14:00 15:00

Chiedo troppo ?
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5