Incollonare valori per mese

domenica 12 ottobre 2008 - 21.06

squilibrio Profilo | Expert

Ciao a tutti, ho una tabella con un elenco di valori


CREATE TABLE [dbo].[Flussi](
[ID] [int] NULL,
[Tipo] [varchar](1) COLLATE Latin1_General_CI_AS NULL,
[Descrizione] [varchar](200) COLLATE Latin1_General_CI_AS NULL,
[Mese] [int] NULL,
[Importo] [decimal](18, 2) NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'C Costi - R Ricavi' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Flussi', @level2type=N'COLUMN',@level2name=N'Tipo'


Io partendo da un range DataInizio e DataFine (tipo DateTime) passato ad una stored procedure

vorrei visualizzare i valori sopra indicati in questo modo:


in colonna gli X mesi del range DataInizio DataFine

in riga l'elenco delle descrizione (records) ma incolonnando l'importo nel mese corretto (utilizzando come riferimento il campo "mese")

Grazie mille

lbenaglia Profilo | Guru

>vorrei visualizzare i valori sopra indicati in questo modo:
>
>
>in colonna gli X mesi del range DataInizio DataFine
>
>in riga l'elenco delle descrizione (records) ma incolonnando
>l'importo nel mese corretto (utilizzando come riferimento il
>campo "mese")

Se ho capito bene vuoi realizzare una query a campi incrociati.
SQL Server a partire dalla versione 2005 implementa l'apposito operatore PIVOT di cui trovi ampia documentazione sui Books Online.

Se desideri ricevere un aiuto più mirato posta un esempio completo con la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set finale che intendi ottenere con quei dati.

>Grazie mille
Prego.

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

squilibrio Profilo | Expert

Grazie mille per l'aiuto!! Ho qualche problemino

la tabella è

CREATE TABLE [dbo].[Flussi](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Tipo] [varchar](1) COLLATE Latin1_General_CI_AS NULL,
[Descrizione] [varchar](200) COLLATE Latin1_General_CI_AS NULL,
[Mese] [int] NULL,
[Importo] [decimal](18, 2) NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'C Costi - R Ricavi' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Flussi', @level2type=N'COLUMN',@level2name=N'Tipo'


Ho preparato alcune insert


INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Rimborso'
,2
,200)

INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Rimborso'
,2
,200)


INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Rimborso'
,5
,200)


INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Rimborso'
,3
,100)

INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Rimborso'
,4
,230)

INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Fattura passiva'
,1
,100)

INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Fattura passiva'
,2
,400)


INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Fattura passiva'
,5
,200)


INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Fattura passiva'
,6
,140)

INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Fattura passiva'
,4
,90)

INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Personale'
,4
,100)

INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Personale'
,1
,120)



Praticamente ho dei gruppi di elementi da sommare tra loro (già totalizzati per mese ... quindi per ogni gruppo avrò SOLO una volta, al massimo, ogni mese)

ipotesi di gruppi sono

Rimborso
Fattura passiva
Personale

ho piu records per ogni gruppo (in questo caso 3 gruppi) e come già indicato, ogni mese compare solo una volta per ogni gruppo


io vorrei una totalizzazione di questo tipo

in colonna il range DataInizio DataFine passato alla Stored Procedure

in riga

Rimborso
Fattura passiva
Personale

e nelle colonne i valori dei mesi "incolonnati"


L'ideale sarebbe mostrare questi flussi in un GridView

Grazie mille!!

lbenaglia Profilo | Guru

>Praticamente ho dei gruppi di elementi da sommare tra loro (già
>totalizzati per mese ... quindi per ogni gruppo avrò SOLO una
>volta, al massimo, ogni mese)
OK, abbiamo tabella e dati.
Ora puoi mostrarci il result set che vuoi ottenere con quei dati?

Un output del tipo:

col1 col2 coln ------- ------- ... ------- val1 val2 ... valn val3 val4 ... valm

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

squilibrio Profilo | Expert

Ho notato di aver inserito un


INSERT INTO [Flussi]
([Tipo]
,[Descrizione]
,[Mese]
,[Importo])
VALUES
('C'
,'Rimborso'
,2
,200)

in piu

non ci sono due mesi uguali a pari "descrizione", quindi considerane solo uno


quello che voglio in un gridview sono X colonne (una per ogni mese)

se passo alla stored procedure Start date 01/01/2008 e End date 31/08/2008


visualizzerò 8 mesi in colonna

1 2 3 4 5 6 7 8

in riga

Rimborso
Fattura Passiva
Persona


e nell'incrocio delle colonne

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
Rimborso | 0 | 200 | 100 | 230 | 200 | 0 | 0 | 0
Fattura Passiva | 100 | 400 | 0 | 0 | 200 | 140 | 0 | 0
Persona | 120 | 0 | 0 | 100 | 0 | 0 | 0 | 0



il tutto in un grid view che avrà le colonne "dinamiche" in funzione dei valori passati alla SP (range dei mesi)

Grazie mille


lbenaglia Profilo | Guru

>quello che voglio in un gridview sono X colonne (una per ogni
>mese)
>
>se passo alla stored procedure Start date 01/01/2008 e End date
>31/08/2008
Ma la tabella non contiene né il giorno, né l'anno, di conseguenza il tuo discorso fila solo se i dati si riferiscono ad uno stesso anno.

>visualizzerò 8 mesi in colonna
>
>1 2 3 4 5 6 7 8
>
>in riga
>
>Rimborso
>Fattura Passiva
>Persona
Purtroppo l'operatore PIVOT non è dinamico, quindi devi prevedere in output i 12 mesi come nel seguente esempio:

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

>Grazie mille
Prego.

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

squilibrio Profilo | Expert

Grazie infinite per l'aiuto!!!
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