私は非常に単純なテーブルを持っています:
Date, kWh
約4年間のデータがあります。
次のような結果セットを生成するにはどうすればよいですか。
Year, Result
2010, 123211
2011, 123213
2012, 123211
2013, xxxxxx
ここで、xxxx はその年の予測です。
予測は、これまでの 2013 年の日付の合計を組み合わせ、平均 kWh に 2013 年の残りの日数を掛けた値に加算されます。
私は非常に単純なテーブルを持っています:
Date, kWh
約4年間のデータがあります。
次のような結果セットを生成するにはどうすればよいですか。
Year, Result
2010, 123211
2011, 123213
2012, 123211
2013, xxxxxx
ここで、xxxx はその年の予測です。
予測は、これまでの 2013 年の日付の合計を組み合わせ、平均 kWh に 2013 年の残りの日数を掛けた値に加算されます。
これにより、うるう年の予測使用量が正しく計算されます。ご覧のとおり、うるう年の計算には他の計算よりも多くのロジックが必要です。年が進むにつれて予測が近づくため、1 年が経過すると、「予測」は実際の使用を示します。
SELECT DATEPART(YEAR, [Date]) year, SUM(kWh) *
(365 + ISDATE(CAST(DATEPART(YEAR, [DATE]) AS char(4)) + '0229')) /
COUNT(kWh) Projected
FROM readings
GROUP BY DATEPART(YEAR, [Date])
複数年の平均カウントを作成するには、クエリを少し変更する必要があります。
WITH average AS (SELECT AVG(kWh) kWh FROM readings)
SELECT DATEPART(YEAR, a.[Date]) year, SUM(a.kWh) + AVG(b.kWh) *
((365 + ISDATE(CAST(DATEPART(YEAR, a.[DATE]) AS char(4)) + '0229')) -
COUNT(a.kWh)) Projected
FROM readings a, average b
GROUP BY DATEPART(YEAR, a.[Date])
これは cte を使用して平均を計算し、後でクエリで使用します。
2 つのクエリを作成する必要があります。1 つ目は YEAR による単純なグループで、2 つ目は昨年、残り日数、平均 kWh に関する 1 行の情報クエリです。次に、これらのテーブルを LEFT JOIN すると、必要なものが得られます。
with t1 as
(
select
DATEPART(YEAR,[Date]) as Year,
sum(kWh) SumKWH
from t
group by
DATEPART(YEAR,[Date])
),
t2 as
(
select max(DATEPART(YEAR,[Date])) as MaxYear,
AVG(kWH) as AverageKWH,
DATEDIFF(DAY,max([Date]),
CAST( CAST(max(DATEPART(YEAR,[Date])) as varchar(4))+'-12-31' as datetime)
) DaysLeft
from t
)
select t1.YEAR,
t1.SumKWH+ISNULL(AVERAGEKWH*DAYSLEFT,0)
from t1
left join t2 on (t1.Year=t2.MaxYear)
order by t1.YEAR;
毎年が 365 日であると仮定すると、確かにそうではありません...
select Datepart(YEAR,[Date]) as [Year],
case when Datepart(YEAR,[Date]) = Datepart(YEAR, getdate())
then 365*Avg(Kwh)
else SUM(Kwh) end as TotalKwh
from table_1
group by Datepart(YEAR,[Date])