2015-05-18 1 views
2

У меня есть эта таблица:Новая колонка со средним по дате в SQL Server

OrganizationCode | CreatedDate    | TotalCost 
102    | 2015-05-18 00:00:00.000 | 200 
102    | 2015-05-18 00:00:00.000 | 550 
102    | 2015-05-15 00:00:00.000 | 700 
102    | 2015-05-15 00:00:00.000 | 1200 
103    | 2015-01-27 00:01:12.720 | 1275,46 
103    | 2015-01-27 00:01:12.720 | 1275,46 
103    | 2015-01-27 00:01:12.720 | 1275,46 

И мне нужно добавить две колонки:

среднесуточной = сумма значений по дате

суточное количество = Сумма по дате

Я хочу, чтобы результат ниже:

OrganizationCode | CreatedDate  | TotalCost | Daily Average | Daily Amount  
-----------------|------------------|-----------|---------------|--------  
102    | 2015-05-18 00:00 | 200  | 375   | 2  
102    | 2015-05-18 00:00 | 550  | 375   | 2  
102    | 2015-05-15 00:00 | 700  | 950   | 2  
102    | 2015-05-15 00:00 | 1200  | 950   | 2  
103    | 2015-01-27 00:01 | 1275,46 | 1275,46  | 3  
103    | 2015-01-27 00:01 | 1275,46 | 1275,46  | 3  
103    | 2015-01-27 00:01 | 1275,46 | 1275,46  | 3 

я попробовать этот запрос:

SELECT OrganizationCode 
      , CreatedDate 
      , (SELECT avg(TotalCost) AS x 
       FROM #TempLocalOrg 
       Group By CAST(CreatedDate as date)) 
    FROM #TempLocalOrg 

Нет, успеха на суб выберите работы, но мне нужно, чтобы дублировать результаты

+0

Вы что-то пробовали, правда? В чем проблема? Поделитесь своим SQL-запросом с нами. – Bikku

+1

Кажется, что значения для Daily Average и Daily Amount поступают из таблицы temp #TempLocalOrg. Не могли бы вы добавить эту схему таблицы и в вопрос? –

+0

Извините, мое первое сообщение. Он включает в себя запрос. Это временная таблица, но в этом случае можно считать обычной таблицей. –

ответ

3

Лучший способ сделать это было бы использовать оконные функции:

SELECT OrganizationCode, CreatedDate 
    , AVG(TotalCost) OVER (PARTITION BY CreatedDate) AS [Daily Average] 
    , COUNT(*) OVER (PARTITION BY CreatedDate) AS [Daily Amount] 
    FROM #TempLocalOrg; 

выше предполагает, что даты округлые или усеченные до ближайшего дня.

+1

И если они еще не усечены до уровня даты, вы можете сделать 'partition by cast (createddate as date)' –

0
SELECT OrganizationCode 
     , CreatedDate 
     , TotalCost 
     , aggregates.AvgCost AS 'Daily Average ' 
     , aggregates.CountCost AS 'Daily Amount' 
FROM #TempLocalOrg tmp 
CROSS APPLY 
(
    SELECT AVG(TotalCost) as AvgCost 
     ,COUNT(1) AS CountCost 
    FROM #TempLocalOrg crossTemp 
    WHERE CAST(tmp.CreatedDate as date) = CAST(crossTemp.CreatedDate as date) 
) aggregates 

Как вам необходимо не агрегировать значения, мы не могли использовать группа по. Вместо этого я использовал CROSS APPLY для сопоставления результатов каждой даты и агрегата, чтобы применить ее к каждой строке, отличной от строки. Не стесняйтесь обращаться ко мне, если вам нужно какое-либо разъяснение.

+0

Спасибо, это сработало! –

Смежные вопросы