考虑到下表(为了这个问题的目的,大大简化了):
id perPeriod actuals createdDate
---------------------------------------------------------
1 14 22 2011-10-04 00:00:00.000
2 14 9 2011-10-04 00:00:00.000
3 14 3 2011-10-03 00:00:00.000
4 14 5 2011-10-03 00:00:00.000
我需要一个查询,它给出了平均每日“实际”数字。但请注意,每天有两个记录(通常更多),所以我不能只做AVG(实际)。
另外,如果每日“实际值”平均值超过每日“perPeriod”平均值,我想取perPeriod值而不是“average”值。因此,在前两个记录的情况下:10月4日的实际平均值是(22 + 9)/ 2 = 15.5。并且同一天的perPeriod平均值是(14 + 14)/ 2 = 14.现在,15.5大于14,因此那天的每日“实际”平均值应该是“perPeriod”平均值。
希望这是有道理的。任何指针都非常感激。
我需要每日平均值,而不是每个日期的平均值。正如我所说,我很乐意在整个桌子上做AVG(实际),但复杂的因素是某一天可能会占用多行,这会使结果产生偏差。
答案 0 :(得分:1)
这是你想要的吗?
首先,如果第二个payperiod平均值需要是不同分组的平均值(在这种情况下不是这样),那么你需要使用这样的子查询:
Select t.CreatedDate,
Case When Avg(actuals) < p.PayPeriodAvg
Then Avg(actuals) Else p.PayPeriodAvg End Average
From table1 t Join
(Select CreatedDate, Avg(PayPeriod) PayPeriodAvg
From table1
Group By CreatedDate) as p
On p.CreatedDate = t.CreatedDate
Group By t.CreatedDate, p.PayPeriodAvg
或者,在这种情况下,由于PayPeriod Average被分组在同一个东西(CreatedDate)作为实际平均值,你不需要子查询,所以更容易:
Select t.CreatedDate,
Case When Avg(actuals) < Avg(PayPeriod)
Then Avg(actuals) Else Avg(PayPeriod) End Average
From table1 t
Group By t.CreatedDate
使用您的样本数据,这两个都返回
CreatedDate Average
----------------------- -----------
2011-10-03 00:00:00.000 4
2011-10-04 00:00:00.000 14
答案 1 :(得分:0)
SELECT DAY(createdDate), MONTH(createdDate), YEAR(createdDate), MIN(AVG(actuals), MAX(perPeriod))
FROM MyTable
GROUP BY Day(createdDate, MONTH(createdDate), YEAR(createdDate)
答案 2 :(得分:0)
试试这个:
select createdDate,
case
when AVG(actuals) > max(perPeriod) then max(perPeriod)
else AVG(actuals)
end
from SomeTestTable
group by createdDate