16 messaggi dal 11 settembre 2009
Salve a tutti, a volte ritornano....

Il problema è in sostanza questo:

Ho una tabella (anche se in effetti sono molte) dove ho tutti gli ordini dai clienti, sia evasi che da evadere, ordinati per data.
In base a questi ordini devo "costruire" una tabella con gli ordini previsti, in base alla media del periodo fra gli ordini precedenti e, dall'ultimo ordine acquisito.
Esiste già qualcosa di preconfezionato?
Devo, a mano a mano che registro gli ordini, calcolare e tenermi traccia della media dei gg. per cliente oppure è opportuno fare il calcolo, con una procedura, ogni volta che devo consultare gli ordini previsti? Oppure ancora, devo crearmi una tabella con gli ordini "previsti" che andrò a popolare ad ogni ordine nuovo registrato?
Grazie a chi vorrà rispondermi. Giuseppe
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
e' difficile "rispondere"...
tecnicamente puoi probabilmente ottenere il risultato anche nell'immediatezza dell'esigenza, e quindi calcolare di volta in volta il forecast, ma puoi anche "precalcolarlo".. ovviamente il fatto del precalcolo ti consente di gestire cardinalita' elevate in "poco tempo" (al fine dell'esecuzione della query di reportistica) ma ovviamente necessita dei parametri di pre aggregazione, quindi tutta la logica relativa, che deve essere conosciuta a priori... diversamente, il forecast eseguito "a richiesta", malgrado sicuramente piu' costoso in termini di esecuzione, ti consente di ovviare questa esigenza.. vedi tu..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
16 messaggi dal 11 settembre 2009
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?
Quale funzione devo usare per calcolare la media dei giorni intercorsi fra gli ordini evasi in precedenza?
Grazie di nuovo. Giuseppe
1.976 messaggi dal 27 luglio 2005
Contributi
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

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.