salve Giuseppe,
grigon wrote:
Salve Andrea e grazie della risposta.
Penso che inserirò un nuovo record nel DB previsioni ogniqualvolta un ordine viene evaso.
A tal proposito conviene usare un trigger?
puoi usare sia un trigger che una stored procedure... per mia forma mentale userei la seconda opzione, visto che solitamente consento l'accesso ai dati esclusivamente tramite procedure e non direttamente alle base tables..
Quale funzione devo usare per calcolare la media dei giorni intercorsi fra gli ordini evasi in precedenza?
basare un forecasting su medie aritmetiche e' possibile, anche se improbabile.. spesso gli algoritmi sono molto piu' complicati, ma tant'e'... nel caso piu' semplice puoi calcolarti una windowing di ogni ordine che indichi il numero di giorni trascorsi dal precedente, e quindi calcolarne una media (AVG), trivialmente similarmente a
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Ordini (
Id int NOT NULL IDENTITY,
IdCliente int NOT NULL,
referential constraint
DataOrdine datetime NOT NULL
);
CREATE TABLE dbo.DettaglioOrdini (....);
INSERT INTO dbo.Ordini VALUES ( 1, '20090101' );
INSERT INTO dbo.Ordini VALUES ( 2, '20090105' );
INSERT INTO dbo.Ordini VALUES ( 1, '20090110' );
INSERT INTO dbo.Ordini VALUES ( 1, '20090111' );
INSERT INTO dbo.Ordini VALUES ( 2, '20090115' );
INSERT INTO dbo.Ordini VALUES ( 1, '20090120' );
INSERT INTO dbo.Ordini VALUES ( 1, '20090125' );
INSERT INTO dbo.Ordini VALUES ( 2, '20090125' );
GO
DECLARE @IdCliente int = 1;
WITH cte AS (
SELECT o.Id, o.IdCliente, o.DataOrdine
, (SELECT MAX(o2.DataOrdine)
FROM dbo.Ordini o2
WHERE o2.IdCliente = o.IdCliente AND o2.DataOrdine < o.DataOrdine) AS [DataOrdinePrecedente]
FROM dbo.Ordini o
WHERE o.IdCliente = @IdCliente
),
cte2 AS (
SELECT cte.Id, cte.IdCliente, DATEDIFF(DD, cte.DataOrdinePrecedente, cte.DataOrdine) AS [Delta]
FROM cte
)
SELECT cte2.IdCliente, AVG(cte2.Delta) AS [Media]
FROM cte2
GROUP BY cte2.IdCliente;
GO
DROP TABLE dbo.Ordini
--<-------------
IdCliente Media
---------
-----------
1 6
Warning: Null value is eliminated by an aggregate or other SET operation.
saluti