>se voglio creare una vista, invece che fare una query esplicita,
>devo cambiare qualcosa nello script oppure va bene così?
Devi togliere la clausola ORDER BY in quanto non è ammessa (e non ha senso) in una vista.
>Inoltre se volessi creare una colonna che contiene la differenza
>tra le due date di attivazione e disattivazione, è possibile
>crearla direttamente con la query?
Certo, osserva il seguente esempio:
USE tempdb;
CREATE TABLE dbo.foo(
DataOra datetime NOT NULL,
Segnalazione varchar(10) NOT NULL,
Stato bit NOT NULL
);
INSERT dbo.foo
VALUES ('20101031 12:00:00', 'Allarme 1', 1)
, ('20101031 12:30:00', 'Allarme 1', 0)
, ('20101101 10:30:00', 'Allarme 2', 0)
, ('20101101 10:00:00', 'Allarme 2', 1)
, ('20101101 09:30:00', 'Allarme 1', 0)
, ('20101101 09:00:00', 'Allarme 1', 1)
, ('20101101 12:30:00', 'Allarme 2', 0)
, ('20101101 12:00:00', 'Allarme 2', 1)
, ('20101101 13:00:00', 'Allarme 2', 1)
, ('20101101 13:30:00', 'Allarme 2', 0)
, ('20101101 13:00:00', 'Allarme 3', 1)
, ('20101101 13:30:00', 'Allarme 3', 0);
SET ANSI_WARNINGS OFF;
GO
CREATE VIEW dbo.vw_Allarmi(DataOraAttivazione, DataOraDisattivazione, Minuti, Segnalazione)
AS
WITH CTE_Pivot(Attivazione, Disattivazione, Segnalazione, Sezione) AS
(
SELECT
CASE Stato
WHEN 1 THEN DataOra
ELSE NULL
END
, CASE Stato
WHEN 0 THEN DataOra
ELSE NULL
END
, Segnalazione
, ROW_NUMBER() OVER(ORDER BY Segnalazione, Stato, DataOra) -
RANK() OVER(ORDER BY Segnalazione, Stato)
FROM dbo.foo
)
SELECT
MAX(Attivazione)
, MAX(Disattivazione)
, DATEDIFF(MINUTE, MAX(Attivazione), MAX(Disattivazione))
, Segnalazione
FROM CTE_Pivot
GROUP BY Segnalazione, Sezione;
GO
SELECT *
FROM dbo.vw_Allarmi
ORDER BY Segnalazione, DataOraAttivazione;
/* Output:
DataOraAttivazione DataOraDisattivazione Minuti Segnalazione
----------------------- ----------------------- ----------- ------------
2010-10-31 12:00:00.000 2010-10-31 12:30:00.000 30 Allarme 1
2010-11-01 09:00:00.000 2010-11-01 09:30:00.000 30 Allarme 1
2010-11-01 10:00:00.000 2010-11-01 10:30:00.000 30 Allarme 2
2010-11-01 12:00:00.000 2010-11-01 12:30:00.000 30 Allarme 2
2010-11-01 13:00:00.000 2010-11-01 13:30:00.000 30 Allarme 2
2010-11-01 13:00:00.000 2010-11-01 13:30:00.000 30 Allarme 3
(6 row(s) affected)
*/
DROP VIEW dbo.vw_Allarmi;
DROP TABLE dbo.foo;
>Grazie.
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/