2014-09-24 2 views
3

Я пытаюсь написать запрос, который позволит мне захватывать ТОЛЬКО самые последние записи за каждый месяц, а затем суммировать их. Ниже приведен пример моей таблицы. То, что я хочу сделать, это выбрать предыдущий месяц. Если я смогу это сделать, я могу понять, как захватить 2 месяца назад, год назад, квартал и т. Д.Выберите только самую последнюю запись за каждый месяц

Оглядываясь ниже, если мы находимся в октябре, я хочу взять и подытожить только записи на 9/24/2014 8:57

Я также хочу написать отдельный запрос, который делает то же самое, но в течение августа.

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

DECLARE @FirstDayofPrevMonth datetime 
SET @FirstDayofPrevMonth = CONVERT(DATE, DATEADD(MONTH, -1, DATEADD(DAY, 1 - DAY(GETDATE()),  
GETDATE()))) 
DECLARE @LastDayofPrevMonth datetime 
SET @LastDayofPrevMonth = CONVERT(DATE, DATEADD(DAY, 1 - DAY(GETDATE()), GETDATE())) 


DECLARE @FirstDayofPrevMonthPrior datetime 
SET @FirstDayofPrevMonthPrior = dateadd(MONTH, -2,@FirstDayofPrevMonth) 
DECLARE @LastDayofPrevMonthPrior datetime 
SET @LastDayofPrevMonthPrior = DATEADD(MONTH,-2,@LastDayofPrevMonth) 

enter image description here

UPDATE: Вот что я использовал в качестве моего последнего рабочего раствора:

SELECT SUM(NumofAccounts) AS Total 
       FROM dbo.Summary 
       WHERE ImportDate = (select MAX(importdate) from AllAcctInfoSummary 
        where year(importdate) = year(@LastDayofPrevMonth) 
        and month(importdate) = month(@LastDayofPrevMonth)) 
        group by ImportDate 
+0

Возможно, вы захотите включить тестовые данные в текстовую форму для легкая вырезка. –

+0

Я не знаю, как ... – donviti

+0

Вы конкретно хотите использовать переменные? потому что есть более простые способы сделать это – FuzzyTree

ответ

2

Try:

select sum(some_column) 
from my_table 
where importdate = 
(select max(importdate) 
from my_table 
where year(importdate) = 2014 
and month(importdate) = 10) 
group by importdate 

Вы можете заменить 2014 и 10 с переменными после установки года и месяц, который вы хотите. Вышеупомянутый запрос логически то, что вы хотите, вы можете просто переделывать переменные, которые вы используете. Вы также можете использовать переменную FirstDayofPrevMonth и называть YEAR и MONTH, чтобы получить правильные значения для сравнения с вашей таблицей.

+0

ОК, так что я буду da ## ed. Еще раз я танцевал вокруг решения. Это работает. Мне просто нужно найти способ подключить переменные. Было бы очень полезно, хотя если бы я смог захватить последний день, в таблице будут данные за месяц, в котором я ищу – donviti

+0

@donviti. Если вы хотите, чтобы день просто использовал DAY (ImportDate), чтобы получить день с даты. Если я неправильно понимаю, что вы хотите, просто дайте мне пример. – Vulcronos

+0

в месяц (importdate) = 10 Я хочу поставить свою переменную 'month (importdate) = @FirstDayofPrevMonth' – donviti

2

это поможет вам сумму для каждого наибольшего доступного числа каждого месяца

select ImportDate, sum(NumOfAccounts) 
from mytable t1 
where not exists (
    select 1 
    from mytable t2 where t2.ImportDate > t1.ImportDate 
    and month(t2.ImportDate) = month(t1.ImportDate) 
    and year(t2.ImportDate) = year(t1.ImportDate) 
) 
group by ImportDate 
order by ImportDate 

, если вы хотите в предыдущем месяце добавить следующее к где

and month(dateadd(month,-1,getdate())) = month(ImportDate) 
and year(dateadd(month,-1,getdate())) = year(ImportDate) 

же запрос с использованием аналитических функций , который должен быть немного быстрее

select ImportDate, sum(NumOfAccounts) 
from (
    select *, 
    rank() over (partition by month(ImportDate), year(ImportDate) order by ImportDate desc) rk 
    from mytable 
) t1 where rk = 1 
group by ImportDate 
order by ImportDate 
+0

Мне нравится это решение немного лучше. Вы, ребята, удивительны здесь. Благодарю.В конечном счете, как я уже сказал, мне захочется Предыдущий месяц. Текущий квартал, предшествующий год в том же месяце, поэтому это позволяет мне (я полагаю) вставить мои переменные – donviti

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