Aiuto per query a campi incrociati

lunedì 12 marzo 2007 - 19.39

fabiogvn Profilo | Newbie


Cerco di semplificare al massimo la richiesta con un esempio:

Tabella con tre campi: Data, Ora e Valore
La tabella è popolata come segue:


Data Ora Valore
12/03/2007 10 23
12/03/2007 11 32
12/03/2007 12 45
12/03/2007 13 12
13/03/2007 10 24
13/03/2007 11 21
13/03/2007 12 46
13/03/2007 13 57
14/03/2007 10 36
14/03/2007 11 68
14/03/2007 12 26
14/03/2007 13 38
ecc.

In sostanza per ogni data vengono memorizzati alcuni orari con un valore variabile.

Avrei bisogno di creare una vista tabellare con un giorno per ogni riga ed un'orario per ogni colonna: all'incrocio di data ed ora dovrebbe uscire il valore variabile.
Es:
10 11 12 13
12/03/2007 23 32 45 12
13/03/2007 24 21 46 57
14/03/2007 36 68 26 38

Devo creare una pagina asp con questo report, se riesco ad ottenere i risultati con una query posso utilizzare una gridview altrimenti devo inserire i dati uno ad uno tramite dei cicli e vorrei evitare se possibile, visto che qui ho semplificato ma il tutto è più complesso ed i record sono moltissimi

lbenaglia Profilo | Guru

>Devo creare una pagina asp con questo report, se riesco ad ottenere
>i risultati con una query posso utilizzare una gridview altrimenti
>devo inserire i dati uno ad uno tramite dei cicli e vorrei evitare
>se possibile, visto che qui ho semplificato ma il tutto è più
>complesso ed i record sono moltissimi

Ciao fabiogvn,

che DBMS utilizzi?
In SQL Server 2005 potresti ricorrere all'operatore PIVOT:

USE tempdb; CREATE TABLE dbo.Valori( Data smalldatetime NOT NULL, Ora smalldatetime NOT NULL, Valore tinyint NOT NULL ); INSERT dbo.Valori VALUES('20070312', '10:00', 23); INSERT dbo.Valori VALUES('20070312', '11:00', 32); INSERT dbo.Valori VALUES('20070312', '12:00', 45); INSERT dbo.Valori VALUES('20070312', '13:00', 12); INSERT dbo.Valori VALUES('20070313', '10:00', 24); INSERT dbo.Valori VALUES('20070313', '11:00', 21); INSERT dbo.Valori VALUES('20070313', '12:00', 46); INSERT dbo.Valori VALUES('20070313', '13:00', 57); INSERT dbo.Valori VALUES('20070314', '10:00', 36); INSERT dbo.Valori VALUES('20070314', '11:00', 68); INSERT dbo.Valori VALUES('20070314', '12:00', 26); INSERT dbo.Valori VALUES('20070314', '13:00', 38); /* Pivoting in SQL Server 2005 */ SELECT Data , [10:00] , [11:00] , [12:00] , [13:00] FROM ( SELECT CONVERT(char(10), Data, 103) AS Data , CONVERT(char(5), Ora, 108) AS Ora , Valore FROM dbo.Valori) AS SourceTable PIVOT ( MAX(Valore) FOR Ora IN([10:00], [11:00], [12:00], [13:00]) ) AS PivotTable; GO /* Output: Data 10:00 11:00 12:00 13:00 ---------- ----- ----- ----- ----- 12/03/2007 23 32 45 12 13/03/2007 24 21 46 57 14/03/2007 36 68 26 38 (3 row(s) affected) */ /* Pulizia */ DROP TABLE dbo.Valori;

Per brevità ho considerato il range di ore riferito ai dati che hai postato. Una soluzione completa dovrebbe considerare tutte le 24 ore.

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

fabiogvn Profilo | Newbie

Grazie per la risposta, è proprio quel che cercavo di fare ma non riuscivo a comporre la giusta query. In realtà la cosa è un pò più complessa perchè le ore non sono le 24 ore canoniche ma possono essere variabili, memorizzate in secondi dalla mezzanotte, sono contenute in una tabella come record e sono almeno un centinaio. Per questo sto provando a "girare" la tabella mettendo come intestazione di colonna le date e come righe le ore. Al momento ho risolto riempiendo un datatable manualmente ed associandolo poi ad una griglia, ma sicuramente la query che mi hai suggerito è un'ottima base di partenza per una soluzione più elegante e soprattutto più veloce :-)
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