Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 даты, периоды  [new]
PacManStar
Member

Откуда:
Сообщений: 5
Здравствуйте!

Пытаюсь выбрать только те PC_ID по которым за последние @Period месяцев ни разу не были получены деньги - то есть status=1.
Для этих тестовых данных нужно получить PC_ID = 1, но мой кривой запрос возвращает PC_ID = (1, 3).
И еще как избавиться от подзапроса?

Спасибо!


IF OBJECT_ID('tempdb..#TEMP_PAYHISTORY') IS NOT NULL
  DROP TABLE #TEMP_PAYHISTORY

CREATE TABLE #TEMP_PAYHISTORY (
  ID INT IDENTITY  --id
 ,PC_ID INT           --личное дело
 ,[MONTH] INT       --месяц
 ,[YEAR] INT          --год
 ,STATUS INT         -- "1" - неоплата; "0" - оплата 
)

INSERT INTO #TEMP_PAYHISTORY
  VALUES (1, 2, 2019, 1),
  (1, 3, 2019, 1),
  (2, 3, 2019, 1),
  (1, 4, 2019, 1),
  (1, 5, 2019, 1),
  (1, 6, 2019, 1),
  (2, 4, 2019, 0),
  (2, 5, 2019, 1),
  (2, 6, 2019, 1),
  (3, 2, 2019, 1),
  (3, 4, 2019, 1),
  (3, 5, 2019, 1),
  (3, 6, 2019, 1)

--определяю максимальную дату
DECLARE @maxDate DATE
SELECT
  @maxDate = (SELECT
      MAX(DATEFROMPARTS(ph.YEAR, ph.MONTH, 1))
    FROM #TEMP_PAYHISTORY ph)

--определяю минимальную дату
DECLARE @Period INT = 4
DECLARE @minDate DATE
SELECT
  @minDate = DATEADD(MONTH, -@Period, @maxDate)

SELECT
  tp1.PC_ID
FROM #TEMP_PAYHISTORY tp1
WHERE tp1.PC_ID NOT IN (SELECT
    tp2.PC_ID
  FROM #TEMP_PAYHISTORY tp2
  WHERE DATEDIFF(MONTH, @minDate, DATEFROMPARTS(tp2.YEAR, tp2.MONTH, 1)) > 0
  AND DATEDIFF(MONTH, @maxDate, DATEFROMPARTS(tp2.YEAR, tp2.MONTH, 1)) < 0
  AND tp2.STATUS = 0)
  GROUP BY tp1.PC_ID




 
3 июн 19, 17:01    [21900721]     Ответить | Цитировать Сообщить модератору
 Re: даты, периоды  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4536
PacManStar, ну... это ваш запрос как раз все "правильно" выдает... за исключением того, что скорее всего вы либо неправильно поняли задачу либо знаете о системе что-то большее чем мы...
SELECT
  tp1.*, DATEFROMPARTS(tp1.YEAR, tp1.MONTH, 1), @minDate, @maxDate
FROM #TEMP_PAYHISTORY tp1
ORDER BY tp1.PC_ID,  DATEFROMPARTS(tp1.YEAR, tp1.MONTH, 1)

И ЧЕМ ПОДЗАПРОС НЕГОДЕН?
3 июн 19, 17:40    [21900749]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить