2014-10-24 3 views
1

У меня есть следующий сценарий:Найдите сумму суммы между датами

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

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

Ввод 2 даты - начало и конец периода, и мне нужно сделать это в одном SQL-запросе.

Ниже приведен запрос, который я использую. Период - это поле даты.

SELECT  
     Period 
     ,sum([Amount]) as 'Amount' 
from  tableA 
where Period between convert(datetime,'201110'+'01',121) and dateadd(second,-1,dateadd(month,1,convert(datetime,'201201'+'01',121))) 
    and cond1 = ..... 
    and cond2 = .... 
group by  
     Period 

Запрос выше приводит к данным, показанным ниже.

enter image description here

Мне нужно, чтобы узнать сумму в последний день каждого месяца, то есть по одному на 31-Окт-11, 30-Ноя-11, 31-Дек-11 и так далее.

Окончательный результат должен выглядеть, как показано ниже (в отличие от того, что я получаю в настоящее время - выше):

enter image description here

Можете ли вы помочь !!

+0

Мы используем Sql Server 2008 –

+0

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

+0

Обновлен с желаемым набором результатов. Как уже упоминалось, данные загружаются еженедельно и один раз в конце месяца. Нам нужна сумма суммы за последний день месяца. Диапазон дат может быть распределен в течение нескольких месяцев. (Пожалуйста, см. Образец запроса, который я опубликовал, - он содержит дату, представленную в формате YYYYMM). –

ответ

4

Если вы просто хотите, чтобы значения за последний день каждого месяца в период я ​​думаю, добавив условие, как это должно работать:

AND Period = DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, period) + 1, 0)) 

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

SELECT 
    Period, 
    SUM([Amount]) AS 'Amount' 
FROM tableA 
WHERE Period BETWEEN CONVERT(DATETIME,'201110'+'01',121) AND DATEADD(SECOND,-1,DATEADD(MONTH,1,CONVERT(DATETIME,'201201'+'01',121))) 
    AND Period = DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, period) + 1, 0)) 
    AND cond1 = ..... 
    AND cond2 = .... 
GROUP BY Period 

Если ваш период datetime имеет значение времени, вам необходимо будет удалить эту часть, чтобы получить совпадение с датой последнего дня, которая предоставляется следующим образом:

AND DATEADD(dd, DATEDIFF(dd, 0, Period), 0) = 
    DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, period) + 1, 0)) 
+0

Мое предположение, что OP ищет что-то вроде этого, переходящего период в ваше предложение 'group by': http://sqlfiddle.com/#!3/6a426/2 – sgeddes

+1

@sgeddes Возможно, но я так не думаю. OP утверждает, что в последний день месяца загружаются данные, и результаты выборки не кажутся суммой для месяца, а дискретным значением для этого конкретного дня. Но я могу ошибаться. – jpw

+0

+1 - на самом деле перечитывая вопрос, я считаю, что вы правы. – sgeddes

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