Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / даты, периоды / 2 сообщений из 2, страница 1 из 1
03.06.2019, 17:01
    #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
03.06.2019, 17:40
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / даты, периоды / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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