Da un singolo a X record recuperando info dalle colonne

martedì 14 ottobre 2008 - 22.24

squilibrio Profilo | Expert

Ho una tabella del tipo:

CREATE TABLE [dbo].[CostiProspect](
[IDCostoProspect] [int] IDENTITY(1,1) NOT NULL,
[Anno] [int] NULL,
[DescrizioneCostoProspect] [varchar](max) COLLATE Latin1_General_CI_AS NULL,
[IDAliquota] [int] NULL,
[Sfasamento] [int] NULL CONSTRAINT [DF_CostiProspect_Sfasamento] DEFAULT ((0)),
[Gennaio] [decimal](18, 2) NULL,
[Febbraio] [decimal](18, 2) NULL,
[Marzo] [decimal](18, 2) NULL,
[Aprile] [decimal](18, 2) NULL,
[Maggio] [decimal](18, 2) NULL,
[Giugno] [decimal](18, 2) NULL,
[Luglio] [decimal](18, 2) NULL,
[Agosto] [decimal](18, 2) NULL,
[Settembre] [decimal](18, 2) NULL,
[Ottobre] [decimal](18, 2) NULL,
[Novembre] [decimal](18, 2) NULL,
[Dicembre] [decimal](18, 2) NULL,
CONSTRAINT [PK_CostiProspect] PRIMARY KEY CLUSTERED
(
[IDCostoProspect] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF



io vorrei trasformare le colonne in righe

quindi partendo da una riga con
descrizione XXX
Anno
Sfasamento
IDAliquota Y
12 valori mensili

vorrei avere 12 righe, una per mese con descrizione,Anno, Sfasamento, IDAliquota in comune

quindi in ogni riga deve cambiare solo i valore del mese ed aggiungere un nuovo campo Mese con il valore del mese (per ogni riga): 1,2,3,4...


Grazie mille

lbenaglia Profilo | Guru

>vorrei avere 12 righe, una per mese con descrizione,Anno, Sfasamento,
>IDAliquota in comune
>
>quindi in ogni riga deve cambiare solo i valore del mese ed aggiungere
>un nuovo campo Mese con il valore del mese (per ogni riga): 1,2,3,4...
Insomma, l'operazione contraria rispetto a quella che mi hai fatto appena fare?
Utilizza l'operatore UNPIVOT (questa volta però lo fai da solo ):
http://msdn.microsoft.com/en-us/library/ms177410.aspx

>Grazie mille
Prego.

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

squilibrio Profilo | Expert

Hai ragione!! La logica è invertita... ci ho provato ma non riesco a capire come applicare il procedimento contrario :-((((

squilibrio Profilo | Expert

Niente.... ci ho provato ma mi perdo :-(((

lbenaglia Profilo | Guru

>Niente.... ci ho provato ma mi perdo :-(((
Prova a vedere se questo esempio può andare:

USE tempdb; CREATE TABLE dbo.CostiProspect( IDCostoProspect int IDENTITY(1,1) NOT NULL, Anno int NULL, DescrizioneCostoProspect varchar(max) NULL, IDAliquota int NULL, Sfasamento int NULL CONSTRAINT DF_CostiProspect_Sfasamento DEFAULT ((0)), Gennaio decimal(18, 2) NULL, Febbraio decimal(18, 2) NULL, Marzo decimal(18, 2) NULL, Aprile decimal(18, 2) NULL, Maggio decimal(18, 2) NULL, Giugno decimal(18, 2) NULL, Luglio decimal(18, 2) NULL, Agosto decimal(18, 2) NULL, Settembre decimal(18, 2) NULL, Ottobre decimal(18, 2) NULL, Novembre decimal(18, 2) NULL, Dicembre decimal(18, 2) NULL, CONSTRAINT PK_CostiProspect PRIMARY KEY(IDCostoProspect ASC) ); INSERT dbo.CostiProspect( Anno , DescrizioneCostoProspect , IDAliquota , Sfasamento , Gennaio ) VALUES(2008, 'Desc1', 1, 1, 100); INSERT dbo.CostiProspect( Anno , DescrizioneCostoProspect , IDAliquota , Sfasamento , Febbraio ) VALUES(2008, 'Desc1', 1, 1, 200); INSERT dbo.CostiProspect( Anno , DescrizioneCostoProspect , IDAliquota , Sfasamento , Giugno ) VALUES(2008, 'Desc1', 1, 1, 300); INSERT dbo.CostiProspect( Anno , DescrizioneCostoProspect , IDAliquota , Sfasamento , Luglio ) VALUES(2008, 'Desc2', 2, 2, 100); INSERT dbo.CostiProspect( Anno , DescrizioneCostoProspect , IDAliquota , Sfasamento , Ottobre ) VALUES(2008, 'Desc2', 2, 2, 200); SELECT Anno , DescrizioneCostoProspect , IDAliquota , Sfasamento , Mese , Importo FROM dbo.CostiProspect UNPIVOT ( Importo FOR Mese IN( Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno , Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre) ) AS unp; /* Output: Anno DescrizioneCostoProspect IDAliquota Sfasamento Mese Importo ----- ------------------------- ----------- ----------- --------- -------- 2008 Desc1 1 1 Gennaio 100.00 2008 Desc1 1 1 Febbraio 200.00 2008 Desc1 1 1 Giugno 300.00 2008 Desc2 2 2 Luglio 100.00 2008 Desc2 2 2 Ottobre 200.00 (5 row(s) affected) */ DROP TABLE dbo.CostiProspect;

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

squilibrio Profilo | Expert

Grazie infinite! Faccio alcune prove

squilibrio Profilo | Expert

La tua query è perfetta!!

Ho fatto alcune prove modificandola per le mie esigenze

SELECT
'C'
, 4
,'Costi Prospect'
, Mese
, SUM(Importo) AS Valore
FROM dbo.CostiProspect
UNPIVOT (
Importo FOR Mese IN(
Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno
, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre)
) AS unp
/* WHERE Anno = @Anno */
GROUP BY Mese


va benissimo, il mio unico problema è che devo avere i mesi in "numeri" 1,2,3,4,5 e non in nome (anche se nella tabella sono in nome)

E' possibile cambiarli in qualche modo? Senza cambiare la tabella?

Grazie infinite!!!

lbenaglia Profilo | Guru

>va benissimo, il mio unico problema è che devo avere i mesi in
>"numeri" 1,2,3,4,5 e non in nome (anche se nella tabella sono
>in nome)
>
>E' possibile cambiarli in qualche modo? Senza cambiare la tabella?

Seguendo il mio esempio puoi modificare la SELECT nel seguente modo:

SELECT Anno , DescrizioneCostoProspect , IDAliquota , Sfasamento , CASE Mese WHEN 'Gennaio' THEN 1 WHEN 'Febbraio' THEN 2 WHEN 'Marzo' THEN 3 WHEN 'Aprile' THEN 4 WHEN 'Maggio' THEN 5 WHEN 'Giugno' THEN 6 WHEN 'Luglio' THEN 7 WHEN 'Agosto' THEN 8 WHEN 'Settembre' THEN 9 WHEN 'Ottobre' THEN 10 WHEN 'Novembre' THEN 11 WHEN 'Dicembre' THEN 12 END AS Mese , Importo FROM dbo.CostiProspect UNPIVOT ( Importo FOR Mese IN( Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno , Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre) ) AS unp; /* Output: Anno DescrizioneCostoProspect IDAliquota Sfasamento Mese Importo ----- ------------------------- ----------- ----------- ------ -------- 2008 Desc1 1 1 1 100.00 2008 Desc1 1 1 2 200.00 2008 Desc1 1 1 6 300.00 2008 Desc2 2 2 7 100.00 2008 Desc2 2 2 10 200.00 (5 row(s) affected) */

>Grazie infinite!!!
Prego.

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

squilibrio Profilo | Expert

Grazie Lorenzo, non avevo pensato al WHEN ... THEN.

Domani provo!!
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