2013-12-18 3 views
0

У меня есть таблица, в которой хранятся транзакции для каждой учетной записи, я написал запрос, который сообщает мне, когда учетная запись заплатила один месяц, но не следующая, в зависимости от параметра MonthID (от кал таблицы перекодировки)ЗАПРОСИТЬ запрос, чтобы получить информацию год к настоящему времени

DECLARE @MonthID INT 
SET @MonthID = 128 

SELECT AccountNo, Emp, 
    FROM Table1 AS t INNER JOIN 
       tblcal AS cl ON t.date = cl.Date 
        WHERE cl.MonthID = @MonthID 
EXCEPT 
SELECT AccountNo, Emp, 
    FROM Table1 AS t INNER JOIN 
       tblcal AS cl ON t.date = cl.Date 
        WHERE cl.MonthID = @MonthID+1 

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

Является ли курсор лучшим способом для этого? Я читал много негативов о курсорах?

На данный момент он возвращает данные, как:

MonthID | SkippedPay 
128  | 12445 

(как я выполнить подсчет на номера счетов)

Что мне нужно, чтобы получить его в течение последних 12 месяцев, так что то же самое как и выше, но с 12-месячными данными, это то, что заставляет меня думать о том, что курсор проходит через каждый месяц и заполняет таблицу?

MonthID | SkippedPay 
128  | 12445 
129  | 1256 
+0

Можете ли вы обновить свой ответ и представить пример того, как вы хотите, чтобы результаты были возвращены? – Kane

+0

@ Kane обновить сейчас – GPH

+0

Не знаете, зачем вам нужен EXCEPT в исходном запросе - можете ли вы объяснить? – Rikalous

ответ

0

Что можно сказать о следующем подходе: You left join набор данных одного месяца с данными для следующего месяца и возвращать строки, в которых нет никаких соответствующих данных в следующем месяце.

DECLARE @MonthID INT 
SET @MonthID = 128 

SELECT MonthA.AccountNo, MonthA.Emp FROM 
(SELECT AccountNo, Emp, cl.MonthID as [Month] 
    FROM Table1 AS t INNER JOIN 
       tblcal AS cl ON t.date = cl.Date 
        WHERE cl.MonthID >= @MonthID-12 and cl.MonthID <= @MonthID) AS MonthA 
LEFT JOIN      
(SELECT AccountNo, Emp, cl.MonthID as [Month] 
    FROM Table1 AS t INNER JOIN 
       tblcal AS cl ON t.date = cl.Date 
WHERE cl.MonthID >= @MonthID-11 and and cl.MonthID <= @MonthID+1) AS MonthB on MonthA.AccountNo = MonthB.AccountNo AND MonthA.Emp = MonthB.Emp AND (MonthA.[Month]+1) = Monthb.[Month] 
WHERE MonthB.AccountNo IS NULL 

p.s .: В вашем запросе есть синтаксическая ошибка: «Emp», без следующего поля.

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