powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / даты, периоды
2 сообщений из 2, страница 1 из 1
даты, периоды
    #39821844
PacManStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

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

Спасибо!


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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




 
...
Рейтинг: 0 / 0
даты, периоды
    #39821866
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PacManStar, ну... это ваш запрос как раз все "правильно" выдает... за исключением того, что скорее всего вы либо неправильно поняли задачу либо знаете о системе что-то большее чем мы...
Код: sql
1.
2.
3.
4.
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)


И ЧЕМ ПОДЗАПРОС НЕГОДЕН?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / даты, периоды
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]