Запросите помощь, пожалуйста - PullRequest
1 голос
/ 05 октября 2011

Учитывая следующую таблицу (очень упрощенную для целей этого вопроса):

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 вместо «среднего» значения.Таким образом, в случае первых двух записей: среднее значение фактических данных за 4 октября составляет (22 + 9) / 2 = 15,5.А среднее значение perPeriod за тот же день равно (14 + 14) / 2 = 14. Теперь 15,5 больше 14, поэтому среднее значение «фактических данных» за этот день должно быть средним значением «perPeriod».* Надеюсь, что это имеет смысл.Любые указатели очень ценятся.

РЕДАКТИРОВАТЬ

Мне нужно общее среднее дневное, а не среднее значение за дату.Как я уже сказал, я хотел бы просто использовать AVG (фактические значения) для всей таблицы, но усложняющим фактором является то, что определенный день может занимать более одной строки, что исказит результаты.

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Это то, что вы хотите?

Во-первых, если второе среднее значение периода оплаты должно быть средним по другой группе (в данном случае это не так), то вам нужно будет использовать такой подзапрос, какthis:

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 сгруппировано по той же вещи (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
0 голосов
/ 05 октября 2011

Попробуйте это:

select createdDate, 
    case
        when AVG(actuals) > max(perPeriod) then max(perPeriod)
        else AVG(actuals)
    end
from SomeTestTable
group by createdDate
0 голосов
/ 05 октября 2011
SELECT DAY(createdDate), MONTH(createdDate), YEAR(createdDate), MIN(AVG(actuals), MAX(perPeriod))
FROM MyTable 
GROUP BY Day(createdDate, MONTH(createdDate), YEAR(createdDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...