Cross Table con due campi da girare in orizzontale?

lunedì 02 agosto 2010 - 10.26
Tag Elenco Tags  Windows Server 2003  |  Windows XP  |  SQL Server 2005

JarkaRuus Profilo | Newbie

Ciao a tutti,
ho bisogno di girare due campi (nnr_codart, pnr_codtchi) di una tabella simile a questa
CREATE TABLE [dbo].[persNNAppMovCtra](
[nnr_numcontr] [int] NOT NULL,
[nnr_rinnid] [int] NOT NULL,
[nnr_codart] [varchar](18) NOT NULL,
[pnr_codtchi] [smallint] NULL)
generando quindi un file di destinazione di questo tipo
CREATE TABLE [dbo].[persContrattiXChiamate](
[nnr_numcontr] [int] NOT NULL,
[nnr_codart] [varchar](18) NULL,
[nnr_codart2] [varchar](18) NULL,
[nnr_codart3] [varchar](18) NULL,
[nnr_codart4] [varchar](18) NULL)
Per girare soltanto il codice articolo, leggendo alcuni thread, sono arrivato a
INSERT persContrattiXChiamate
SELECT
nnr_numcontr, [1], [2], [3], [4]
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY nnr_numcontr ORDER BY nnr_numcontr) AS Col
FROM teammemores.dbo.persNNAppMovCtra
) AS Sorgente
PIVOT (
MAX(nnr_codart)
FOR Col IN ([1], [2], [3], [4])
) AS PivotTable;

Ma per aggiungere il [pnr_codtchi]?

Grazie

Massimo





lbenaglia Profilo | Guru

>Ma per aggiungere il [pnr_codtchi]?
Fai una JOIN con [dbo].[persNNAppMovCtra].
Se non ci riesci posta alcune righe di esempio per entrambe le tabelle (INSERT INTO...) ed il result set che vorresti ottenere con quei dati

>Grazie
Prego.

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

JarkaRuus Profilo | Newbie

Ciao Lorenzo,
che bello ricevere risposte così veloci!

scusa ma mi sono reso conto di avere omesso alcuni campi nella seconda tabella (quella di destinazione), che risulta essere così
CREATE TABLE [dbo].[persContrattiXChiamate](
[nnr_numcontr] [int] NOT NULL,
[nnr_rinnid] [int] NOT NULL,
[nnr_codart] [varchar](18) NULL,
[pnr_codtchi] [smallint] NULL,
[nnr_codart2] [varchar](18) NULL,
[pnr_codtchi2] [smallint] NULL,
[nnr_codart3] [varchar](18) NULL,
[pnr_codtchi3] [smallint] NULL,
[nnr_codart4] [varchar](18) NULL,
[pnr_codtchi4] [smallint] NULL)

Le INSERT esemplificative per la tabella di origine sono
INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P010', 10);
INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P020', 15);
INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P030', 20);
INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P032', 10);
INSERT dbo.persNNAppMovCtra VALUES(1, 2, 'P035', 500);
INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P012', 25);
INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P020', 20);
INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P032', 15);

ciò che mi serve avere nella destinazione è

1 - 1 - P010 - 10 - P020 - 15 - P030 - 20 - P032 - 10 -
1 - 2 - P035 - 500 - NULL - NULL - NULL - NULL - NULL - NULL
2 - 1 - P012 - 25 - P020 - 20 - P032 - 15 - NULL - NULL


Spero sia più chiaro perché temo di non capire dove inserire l'istruzione di JOIN e mi arrendenderei a fare una stored procedure con più istruzioni PIVOT su 2 tabelle temporanee (una per codart e l'altra per codtchi), per poi unirle in una tabella finale...
E' invece possibile riassumere il tutto in una sola istruzione?

Grazie ancora!

Massimo


lbenaglia Profilo | Guru

>scusa ma mi sono reso conto di avere omesso alcuni campi nella
>seconda tabella (quella di destinazione), che risulta essere
>così
>CREATE TABLE [dbo].[persContrattiXChiamate](
>[nnr_numcontr] [int] NOT NULL,
>[nnr_rinnid] [int] NOT NULL,
>[nnr_codart] [varchar](18) NULL,
>[pnr_codtchi] [smallint] NULL,
>[nnr_codart2] [varchar](18) NULL,
>[pnr_codtchi2] [smallint] NULL,
>[nnr_codart3] [varchar](18) NULL,
>[pnr_codtchi3] [smallint] NULL,
>[nnr_codart4] [varchar](18) NULL,
>[pnr_codtchi4] [smallint] NULL)
>
>Le INSERT esemplificative per la tabella di origine sono
>INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P010', 10);
>INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P020', 15);
>INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P030', 20);
>INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P032', 10);
>INSERT dbo.persNNAppMovCtra VALUES(1, 2, 'P035', 500);
>INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P012', 25);
>INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P020', 20);
>INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P032', 15);

I comandi di INSERT non sono corretti per la tabella che hai postato.
Puoi correggere?

>Grazie ancora!
Prego.

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

JarkaRuus Profilo | Newbie

Strano,
a me risultano a posto, forse ho creato confusione con i nomi delle tabelle. Ci riprovo:
La tabella di origine in cui ho i dati è
CREATE TABLE [dbo].[persNNAppMovCtra](
[nnr_numcontr] [int] NOT NULL,
[nnr_rinnid] [int] NOT NULL,
[nnr_codart] [varchar](18) NOT NULL,
[pnr_codtchi] [smallint] NULL);
INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P010', 10);
INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P020', 15);
INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P030', 20);
INSERT dbo.persNNAppMovCtra VALUES(1, 1, 'P032', 10);
INSERT dbo.persNNAppMovCtra VALUES(1, 2, 'P035', 500);
INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P012', 25);
INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P020', 20);
INSERT dbo.persNNAppMovCtra VALUES(2, 1, 'P032', 15);

Vorrei creare un'istruzione PIVOT che girasse i dati sopra così
1 - 1 - P010 - 10 - P020 - 15 - P030 - 20 - P032 - 10 -
1 - 2 - P035 - 500 - NULL - NULL - NULL - NULL - NULL - NULL
2 - 1 - P012 - 25 - P020 - 20 - P032 - 15 - NULL - NULL

per metterli in una tabella di destinazione sìfatta:
CREATE TABLE [dbo].[persContrattiXChiamate](
[nnr_numcontr] [int] NOT NULL,
[nnr_rinnid] [int] NOT NULL,
[nnr_codart] [varchar](18) NULL,
[pnr_codtchi] [smallint] NULL,
[nnr_codart2] [varchar](18) NULL,
[pnr_codtchi2] [smallint] NULL,
[nnr_codart3] [varchar](18) NULL,
[pnr_codtchi3] [smallint] NULL,
[nnr_codart4] [varchar](18) NULL,
[pnr_codtchi4] [smallint] NULL)

Per i comendi SQL sto utilizzando MS SQL Server management studio 2008.

Spero di non aver ulteriormente complicato le cose!

Massimo



lbenaglia Profilo | Guru

>Strano,
>a me risultano a posto, forse ho creato confusione con i nomi
>delle tabelle.
No hai ragione, mi sono confuso io

Con l'operatore PIVOT non puoi traslare 2 colonne pertanto puoi utilizzare il vecchio sistema basato sulla funzione CASE:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

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