97 messaggi dal 27 marzo 2013
Buon giorno,

avrei la necessita di scrivere una query con SQL Server che mi restituisca la media settimanale dando in ingresso una data specifica.

Non so se esistono dei metodi che sono già in grado di riconoscere il giorno della settimana in base alla data(lunedi, martedì, etc).

Quindi la mia domanda è: è possibile creare una procedura che dando una data lui riconosca automaticamente tutti i giorni della settimana a cui appartiene per poi fare la media dei valori correlati ad essa?

Grazie mille!

Andrea
308 messaggi dal 13 luglio 2005
Ciao menelik86,
ci diverse possibilita' per fare quello che dici...
Magari dovresti spiegare meglio quello che vuoi ottenere...

C'e' una funzione SQL che ti dice, inserendo una data, a che giorno della settimana corrisponde (la stessa funzione ti permette di sapere anche la settimana dell'anno o il mese).

Ti faccio un esempio. Se tu scrivi:

SELECT DATEPART(DW, GETDATE())


otterrai il numero del giorno della settimana del giorno in corso (0=domenica, 1=lunedi', ecc..)

Fammi sapere.

Ciao.

Umb
97 messaggi dal 27 marzo 2013
Dunque io ho una tabella con all'intenrno due colonne, una con le date, ed una con dei valori.

Le date possono ripetersi.

Io vorrei una procedura che in base alla data inserita mi restituisca la media di tutti i valori correlati alle date contenute nella settimana della data inserita divise per 7.
Modificato da menelik86 il 11 novembre 2014 18.02 -
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
tipicamente devi aggregare il valore, effettuandone una media statistica come da AVG(...) oppure una media calcolata tipo SUM(...) / 7 filtrando le sole righe che appartengano alla settimana a te interessante...
puoi quindi ottenere il "lunedi' ore 00:00" come primo giorno della settimana e, da questo, ottenere la domenica alle 23.59 come limite superiore permettendo cosi' l'utilizzo di datetime completi, consentendo la ricerca in overlap di anno (quindi il 01/01/2014 come anche il 31/12/2014, dove le rispettive settimante complete possono essere a cavallo di 2 anni);

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
  Data datetime,
  Valore int
  );
GO
DECLARE @i int = 1;
WHILE @i <= 395 BEGIN
  INSERT INTO dbo.t
    SELECT DATEADD(DAY, @i, '20131215'), @i % 4 + 1;
  INSERT INTO dbo.t
    SELECT DATEADD(DAY, @i, '20131215 23:59:59.998'), @i % 9 + 1;
  SET @i += 1;
END;
GO
CREATE PROCEDURE dbo.usp_seek (
  @param date
  )
AS BEGIN
  DECLARE @firstDayOfWeek datetime;
  SELECT @firstDayOfWeek = DATEADD(DAY, -DATEPART(WEEKDAY, DATEADD(DAY, @@DATEFIRST - 1, @param)) + 1, @param);    
  SELECT @firstDayOfWeek AS [Primo giorno della settimana];


  PRINT 'righe ricercate';
  SELECT *, DATENAME(WEEKDAY, Data)
    FROM dbo.t t
    WHERE t.Data BETWEEN @firstDayOfWeek AND DATEADD(millisecond, -2,  DATEADD(DAY, 7, @firstDayOfWeek));

  PRINT 'aggregazione';
  SELECT MIN(t.Data) AS [INIZIO Range],
    MAX(t.Data) AS [FINE Range],
    AVG(t.Valore) AS [Media],
    SUM(t.Valore) / 7 AS [Tua Media Calcolata],
    COUNT(*) AS [Elementi]
    FROM dbo.t t
    WHERE t.Data BETWEEN @firstDayOfWeek AND DATEADD(millisecond, -2,  DATEADD(DAY, 7, @firstDayOfWeek));
END;
GO
EXEC dbo.usp_seek '20140101';

EXEC dbo.usp_seek '20141030';

EXEC dbo.usp_seek '20141231';

GO
DROP PROCEDURE dbo.usp_seek;
DROP TABLE dbo.t;


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.