Запись за последние 2 месяца в SQL

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

Select distinct 
tblRv.Owner,
(Select Count(*) as total from tblvv WHERE MasterID =tblRv.ID and Name <> '') 
as currentdata
from tblRe
inner join tblRv 
On tblRe.RID = tblRv.RID
WHERE 
tblRe.StartDate between dateadd(m, -2, getdate()) and getdate() and 
//tblRe.StartDate >= '2016-07-01 00:00:00' AND 
//tblRe.EndDate <= '2016-07-08 23:59:59' 
  and tblRe.Region = 'uk' and
tblRv.Owner='Roh' 
order by tblRv.Owner

когда я запускаю это, покажи мне это

OwnerName     currentdata
Roh               1
Roh               2
Roh               3
Roh               5

и когда я проверяю индивидуально, записываю запрос и проверяю с даты 2016-07-01 и до даты 2016-07-30, тогда это показывает мне данные 3 и 2016-06-01 00:00:00 и 2016-06-31 23:59:59 показывает мне данные 1 и 2016-05-01 00:00:00, 2016-05-31 23:59:59 показывает мне данные 0
поэтому я хочу такие данные

owner july june may 
roh   3     1   0

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


person user6628729    schedule 26.07.2016    source источник


Ответы (2)


Вы можете попробовать выполнить сводной запрос, в котором три столбца для сводки — это текущий, предыдущий и предыдущий предыдущий месяц в вашем наборе данных. Обратите внимание, что мне пришлось переписать ваш запрос, чтобы удалить подзапросы в предложении SELECT, потому что это делает невозможным агрегирование этих столбцов.

SELECT tblRv.Owner,
    SUM(CASE WHEN tblRe.StartDate = GETDATE() THEN t.total ELSE 0 END) AS currMonth,
    SUM(CASE WHEN tblRe.StartDate = DATEADD(m, -1, GETDATE())
             THEN t.total ELSE 0 END) AS prevMonth,
    SUM(CASE WHEN tblRe.StartDate = DATEADD(m, -2, GETDATE())
             THEN t.total ELSE 0 END) AS lastPrevMonth
FROM tblRe
INNER JOIN tblRv
    ON tblRe.RID = tblRv.RID
INNER JOIN
(
    SELECT MasterID, COUNT(*) AS total
    FROM tblvv
    GROUP BY MasterID
    WHERE Name <> ''
) AS t
    ON tblRv.ID = t.MasterID
WHERE tblRe.StartDate BETWEEN DATEADD(m, -2, GETDATE()) AND GETDATE() AND
      tblRe.Region = 'uk' AND
      tblRv.Owner = 'Roh' 
GROUP BY tblRv.Owner
ORDER BY tblRv.Owner
person Tim Biegeleisen    schedule 26.07.2016
comment
это ошибка шоу. Сообщение 130, уровень 15, состояние 1, строка 4 Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос. - person user6628729; 26.07.2016
comment
что т после где - person user6628729; 26.07.2016
comment
Я не вижу ошибки. t — это псевдоним для подзапроса к таблице tblvv. - person Tim Biegeleisen; 26.07.2016
comment
Хорошо, я помещаю пункт where выше, группируя по &, когда я выполняю это шоу currMonth 0 ,prevMonth 0 , lastPrevMonth0 означает .. owner(roh) currMonth 0,prevMonth 0,lastPrevMonth0 0 - person user6628729; 26.07.2016
comment
но у меня есть данные, т.е. 3,1,0 - person user6628729; 26.07.2016

person    schedule
comment
это ничего не показывает .. только это показывает владельца, месяц, текущие данные в качестве заголовка .. - person user6628729; 26.07.2016
comment
@user6628729 user6628729 можешь настроить скрипт sql? Очень сложно сказать, на что похожи ваши данные и как должен быть написан запрос. - person M.Ali; 26.07.2016
comment
Это не даст желаемого результата, потому что вы не сделали поворот, но я согласен с перемещением запроса подсчета в соединение. - person Tim Biegeleisen; 26.07.2016
comment
но как я получаю данные, когда пытаюсь использовать jsfiddle - person user6628729; 26.07.2016
comment
@ M.Ali это показывает данные, но .. это показывает текущие данные за июль 3 и текущие данные за июнь 10 и данные за май 6 .. но у меня есть данные 3,1,0 .. и это показывает 3,10,6 - person user6628729; 26.07.2016
comment
@M.Ali проверьте это, плз - person user6628729; 26.07.2016