请查询帮助

时间:2011-10-05 02:43:35

标签: sql sql-server-2005

考虑到下表(为了这个问题的目的,大大简化了):

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(实际),但复杂的因素是某一天可能会占用多行,这会使结果产生偏差。

3 个答案:

答案 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