2016-10-03 7 views
0

Ich muss den Durchschnitt pro Tag aus dem ersten Datensatz des Jahres für jede Zeile berechnen. Ich kann es tun, indem ich in einer while-Schleife wiederhole, bin mir aber sicher, dass ich das einfacher erreichen kann. Ich würde eine Abfrage benötigen, um das avgAmount neben dem Feld Betrag zu berechnen.Durchschnitt pro Zeile in SQL Server berechnen

Der Durchschnitt wird einfach berechnet, indem die Beträge summiert und durch die Differenz zwischen den Min- und Max-Daten für jede Zeile dividiert werden.

create table a 
(
date datetime, 
dept varchar(50), 
amount float 
) 

insert into a values ('2016-02-07', 'abc', 25) 
insert into a values ('2016-02-27', 'abc', 20) 
insert into a values ('2016-03-09', 'abc', 30) 
insert into a values ('2016-03-28', 'abc', 45) 
insert into a values ('2016-04-07', 'abc', 40) 
insert into a values ('2016-04-30', 'abc', 50) 
insert into a values ('2016-05-07', 'abc', 60) 
insert into a values ('2016-05-27', 'abc', 50) 
insert into a values ('2016-06-30', 'abc', 38) 
insert into a values ('2016-07-17', 'abc', 45) 
insert into a values ('2016-07-30', 'abc', 55) 
insert into a values ('2016-08-07', 'abc', 70) 

SQLFIDDLE

Jede Hilfe bitte?

+0

Meinen Sie, in diesem Fall, die Summe der Beträge geteilt durch die Anzahl der Tage zwischen 7 Februar und 7. August? Wenn ja, sollten die Ergebnisse nur Daten für eine Abteilung enthalten, oder sollte die Antwort von jeder Abteilung sein? Und auf welcher Datenbank läuft das? SQL Server? MySQL? welche? –

Antwort

1

Versuchen Sie folgendes:

with FirstCalc as 
(
select dept, min(date) as MinDate, max(date) as MaxDate, sum(amount) as TotalAmount 
from a 
group by dept 
) 
select dept, TotalAmount/datediff(dd, MinDate, MaxDate) as AvePerDay 
from FirstCalc 
2

Eine Möglichkeit, es zu tun ist:

SELECT date, amount, 
AVG(amount) OVER(ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT 
ROW) AS AvAmount 
FROM a 
ORDER BY date 

SQL Fiddle

+0

Dies ist eine sehr elegante Lösung, aber leider "ZWISCHEN UNBOUNDED PRECEDING UND CURRENT ROW" ist nicht in SQL Server 2008 implementiert, wo diese Datenbank befindet. Habe es in SQLfiddle getestet und das Ergebnis ist gut. Thabks für Ihre sofortige Hilfe! – NotForFun

1

Wenn SQL Server ist:

Select Sum(a.amount)/datediff(day, start.Date, end.Date) 
From a 
    join a start 
    on start.Date = (Select Min(Date) from a 
        Where Year(date) = @Year 
         and dept = a.Dept) 
    join a end 
    on end.Date = (Select Max(Date) from a 
        Where Year(date) = @Year 
         and dept = a.Dept) 
Where Year(a.Date) = @year