SP con trasposizione di tabella

martedì 12 settembre 2006 - 13.07

bluland Profilo | Guru

Salve,

vorrei realizzare un SP che faccia la seguente cosa:

ho inizialmente due tabelle :

Table1
---------

id matricola anno_week quantita

Table2
---------

matricola


matricola di table2 e' dipendente da matricola di table1

Faccio un esempio di cosa dovrebbe accadere quando si inseriscono dei valori in Table1, cosi mi spiego meglio:
inserimento:

INSERT INTO [PROVA].[dbo].[Table1]([matricola], [anno_week], [quantita])
VALUES(100,200635,1)

prossimo inserimento:
INSERT INTO [PROVA].[dbo].[Table1]([matricola], [anno_week], [quantita])
VALUES(100,200636,3)

INSERT INTO [PROVA].[dbo].[Table1]([matricola], [anno_week], [quantita])
VALUES(100,200701,1)

INSERT INTO [PROVA].[dbo].[Table1]([matricola], [anno_week], [quantita])
VALUES(101,200702,1)

RESULTS table1
----------------
id matricola anno_week quantita'
1 100 200635 1
2 100 200636 3
3 100 200701 1
4 101 200701 1

ed in modo automatico la SP deve creare delle colonne nella table2 in modo da avere il seguente risultato:

RESULTS table2
----------------
matricola 2006 2007
100 5 1
101 0 1

quindi vengono create delle colonne che sono delle substring del campo anno_week che indicano dinamicamente le quantita totali per quell'anno, legate tramite il campo matricola.

Vorrei dei consigli su come procedere, idee?

saluti

ENzo

ps. fatemi sapere se non sono stato abbastanza chiaro.

lbenaglia Profilo | Guru

>INSERT INTO [PROVA].[dbo].[Table1]([matricola], [anno_week],
>[quantita])
>VALUES(100,200635,1)
>
>prossimo inserimento:
>INSERT INTO [PROVA].[dbo].[Table1]([matricola], [anno_week],
>[quantita])
>VALUES(100,200636,3)
>
>INSERT INTO [PROVA].[dbo].[Table1]([matricola], [anno_week],
>[quantita])
>VALUES(100,200701,1)
>
>INSERT INTO [PROVA].[dbo].[Table1]([matricola], [anno_week],
>[quantita])
>VALUES(101,200702,1)
>
>RESULTS table1
>----------------
>id matricola anno_week quantita'
> 1 100 200635 1
> 2 100 200636 3
> 3 100 200701 1
> 4 101 200701 1
>
>ed in modo automatico la SP deve creare delle colonne nella table2
>in modo da avere il seguente risultato:
>
>RESULTS table2
>----------------
>matricola 2006 2007
>100 5 1
>101 0 1

Come sempre i tuoi esempi sono imprecisi, segno che non li hai mai provati anche se ti ho già fatto notare la cosa in passato...

1) Il database Prova noi non lo abbiamo, quindi quei comandi di INSERT dobbiamo modificarli;
2) Il result set è sbagliato riferito ai dati di prova (Per matricola 100, nel 2006 il valore è 4 non 5!).

Non ci dici che DBMS stai utilizzando, la sua versione, ecc...
Infine non è chiaro a cosa serva Tabella2 dato che tutti i dati che ti servono si trovano in Tabella1.

Bene, a questo punto ti fornisco questa soluzione per SQL Server 2005:

USE tempdb; GO CREATE TABLE dbo.Table1( id int NOT NULL IDENTITY PRIMARY KEY, matricola tinyint NOT NULL, anno_week char(6) NOT NULL, quantita tinyint NOT NULL ); GO INSERT dbo.Table1 VALUES(100, '200635', 1); INSERT dbo.Table1 VALUES(100, '200636', 3); INSERT dbo.Table1 VALUES(100, '200701', 1); INSERT dbo.Table1 VALUES(101, '200702', 1); GO SELECT matricola , COALESCE([2006], 0) AS [2006] , COALESCE([2007], 0) AS [2007] FROM ( SELECT matricola , SUBSTRING(anno_week, 1, 4) AS Anno , quantita FROM dbo.Table1 ) AS SourceTable PIVOT ( SUM(quantita) FOR Anno IN([2006], [2007]) ) AS PivotTable; GO /* Output: matricola 2006 2007 --------- ----------- ----------- 100 4 1 101 0 1 (2 row(s) affected) */ DROP TABLE dbo.Table1;

Ciao!

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

bluland Profilo | Guru

>Come sempre i tuoi esempi sono imprecisi, segno che non li hai mai provati anche se ti ho già fatto notare la cosa in >passato...

infatti questo non l'ho provato, anche perche' era piu' mia intenzione capire come farlo!
non mi sono spiegato bene!

>1) Il database Prova noi non lo abbiamo, quindi quei comandi di INSERT dobbiamo modificarli;
>2) Il result set è sbagliato riferito ai dati di prova (Per matricola 100, nel 2006 il valore è 4 non 5!).

Hai ragione svista!

>Non ci dici che DBMS stai utilizzando, la sua versione, ecc...

sql server 2000

>Infine non è chiaro a cosa serva Tabella2 dato che tutti i dati che ti servono si trovano in Tabella1.

in effetti hanno gli stessi dati solo che nella tabella1 le quantita vengono messe per ogni anno_week invece nella tabella2 come sommatoria delle quantita di ogni week di un determinato anno riferite sempre ad uno specifico numero di matricola.

In realta' aldila del fattore applicativo vorrei capire come fare questo tipo di trasposizione, ora guardo il tuo esempio!

grazie

ENzo

bluland Profilo | Guru

Pivot, non l'avevo mai usato lo devo studiare!

Mi spiego meglio:

vorrei che la tabella2 sia una tabella fisica esistente che potra anche essere interrogata indipendentemente da tabella1, e che si vada ad aggiornare ogni volta che si fa un inserimento nella tabella 1.


CIao
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