Это даст вам поставщиков, у которых есть хотя бы одна запись для каждого из последних N месяцев:
declare @N as INT = 6;
WITH CTE AS
(
SELECT DISTINCT supplier_code, CONVERT(varchar(6), CONVERT(date, period_start_date), 112) start_month
FROM API_StockAndSaleHeader
WHERE CONVERT(date, period_start_date) >= DATEADD(month, -@N, CONVERT(date, GETDATE()))
)
SELECT supplier_code
FROM CTE
GROUP BY supplier_code
HAVING COUNT(*) >= @N;
Это сначала получает вспомогательный набор отдельных поставщиков_кодов + месяцев, чтобы знать, какие поставщики имел хотя бы одну запись за последние 6 месяцев. Хитрость заключается в том, чтобы преобразовать дату в varchar и обрезать ее до 6 символов, получив формат yyyymm
. Тогда вам просто нужны те, у которых есть как минимум N записей, что будет означать, что все N месяцев имеют данные. Я использовал >=
на всякий случай, это зависит от того, как вы делите месяцы. Каждые 30/31? 30 дней с сегодняшнего дня?
Примечание. Я использую CONVERT
для преобразования в дату. Кстати, хранить даты как другие типы - это плохо.
С этими данными он будет отображать только Supplier 1
:
select 'Supplier 1' supplier_code, '10/10/2019' period_start_date into API_StockAndSaleHeader
union all
select 'Supplier 1', '11/11/2019'
union all
select 'Supplier 1', '12/12/2019'
union all
select 'Supplier 1', '01/01/2020'
union all
select 'Supplier 1', '02/01/2020'
union all
select 'Supplier 1', '03/01/2020'
union all
select 'Supplier 1', '03/15/2020'
union all
select 'Supplier 1', '04/01/2020'
union all
select 'Supplier 1', '05/01/2020'
union all
select 'Supplier 2', '02/01/2020'
union all
select 'Supplier 2', '03/01/2020'
union all
select 'Supplier 2', '03/15/2020'
union all
select 'Supplier 2', '03/22/2020'
union all
select 'Supplier 2', '03/26/2020'
union all
select 'Supplier 2', '04/01/2020'
union all
select 'Supplier 2', '05/01/2020'
Примечание Поставщик 2 имеет более 6 записей в последнем месяц, но не имеет записей для каждого из последних N месяцев.