2014-02-21 4 views
0

Это мой стол:Выберите недавнее изменение даты в таблице

ID AppName DepCode DepName  Group  ModifiedDate YearlyAmount 
1 Nestle NS  Foods  Products  01/12/14   451 
1 Nestle NS  Foods  Products  01/17/14   495     
2 Oracle OR  Software  Info  01/24/14   279 
2 Oracle OR  Soft & IT  Info  01/26/14   310 
2 Oracle ORL  Software  Info  01/25/14   219 
2 Oracle ORL  Soft   IT   01/28/14   600 

MonthlyAmount Funded AppCategory Research 
37.5623  Yes  NE   NA 
41.2365  No  N    NA 
23.2568  Yes  OR  InProgress 
25.8333  Yes  ORL   NA 
18.2189  Yes  SOF  Approved 
50.0000  No  IT   Rejected 

Ожидаемый результат:

ID AppName DepCode DepName  Group  ModifiedDate YearlyAmount 
1 Nestle NS  Foods   Products 01/17/14   946 
2 Oracle OR  Soft & IT  Info  01/26/14   589 
2 Oracle ORL  Soft   IT   01/28/14   819 

MonthlyAmount Funded AppCategory  Research 
78.7988   No  N    NA 
49.0901   Yes  ORL   NA 
68.2189   No  IT   Rejected 

Я хочу, чтобы выбрать недавно измененную дату DepCode и просуммировать за месяц и год Сумма , Я пробовал этот запрос и не смог получить результат. Также это отдельная таблица.

select B1.[ID], B1.[AppName], B2.[DepCode], B1.[DepName], B1.[Group], 
B2.ModifiedDate, B2.YearlyAmount, B2.MonthlyAmount, 
B1.[Funded], B1.[AppCategory], B1.[Research] 
FROM Business B1 
INNER JOIN 
(select [ID], B1.[DepCode], MAX(ModifiedDate) as ModifiedDate, SUM(YearlyAmount) as YearlyAmount, 
    SUM(MonthlyAmount) as MonthlyAmount 
from Business 
Group by ID, DepCode) B2 
ON B1.ID = B2.ID AND B1.ModifiedDate = B2.ModifiedDate 

Кто-нибудь, пожалуйста, исправьте меня или совет, как решить эту проблему, поскольку я являюсь стартером в SQL.

+0

Вы можете добавить SQL скрипку? – Neels

+0

Вот SQL Fiddle http://sqlfiddle.com/#!3/01cca/4 –

+0

вы не ввели какие-либо данные там. – Neels

ответ

0

Это немного сложнее, поскольку есть несколько столбцов, где вы не можете использовать агрегатные функции - их значения берутся из записи с максимальной датой. Вы можете использовать подзапрос сначала получить итоговые данные и максимальную дату, а затем использовать эту информацию, чтобы получить другие столбцы

select B1.[ID], B1.[AppName], B2.[DepCode], B1.[DepName], B1.[Group], 
    B2.ModifiedDate, B2.YearlyAmount, B2.MonthlyAmount, 
    B1.[Funded], B1.[AppCategory], B1.[Research] 
FROM Business B1 
INNER JOIN 
    (select [ID], DepCode, MAX(ModifiedDate) as ModifiedDate, SUM(YearlyAmount) as YearlyAmount, 
     SUM(MonthlyAmount) as MonthlyAmount 
    from Business 
    Group by ID, DepCode) B2 
ON B1.ID = B2.ID AND B1.ModifiedDate = B2.ModifiedDate 

SQL Fiddle demo

+0

Это одна таблица, и у меня нет двух таблиц, таких как Business B1 и Business. Бизнес - единственная таблица, которую у меня есть. Так как я не мог редактировать, чтобы соответствовать странице, я думаю, ее ошибка. –

+0

Это одна таблица, используемая дважды. B1 - просто псевдоним. – Szymon

+0

Но когда я запускаю это, я получаю сообщение об ошибке с неправильным именем столбца для AppName, DepCode, DepName, Group, Funded, AppCategory и Research. –

0

Проблема заключается в том, что ваши несколько столбцов не имеет то же значение, так что groupby не работал.

Так как вы хотите, recent modified date for DepCodesum Yearly и Monthly Amount

Попробуйте

SELECT [ID], [AppName], [DepCode], 
     MAX(ModifiedDate) AS ModifiedDate, 
     SUM(YearlyAmount) AS YearlyAmount, 
     SUM(MonthlyAmount) AS MonthlyAmount 
FROM [dbo].[Bus] 
GROUP BY DepCode, ID, AppName 
ORDER BY ID 

fiddle

+0

Это прекрасно, но мне нужно показать остальные столбцы. –