как выбрать все записи, которые существуют за последние 6 месяцев? - PullRequest
0 голосов
/ 26 мая 2020

Может ли кто-нибудь предложить мне, как выбрать все записи, которые существуют за последние N месяцев?

N будет параметром.

Я написал ниже подзапрос, чтобы вернуть желаемый результат. но это не динамика c, поскольку я не могу передать номер месяца N, чтобы выбрать записи за последние n месяцев.

SELECT DISTINCT supplier_code
FROM API_StockAndSaleHeader
WHERE supplier_code IN
(SELECT supplier_code
 FROM API_StockAndSaleHeader
 WHERE dbo.ConvertStringToDate(period_start_date) = '2020-03-01')
 AND supplier_code IN
(SELECT supplier_code
 FROM API_StockAndSaleHeader
 WHERE dbo.ConvertStringToDate(period_start_date) = '2020-02-01')
 AND supplier_code IN
(SELECT supplier_code
 FROM API_StockAndSaleHeader
 WHERE dbo.ConvertStringToDate(period_start_date) = '2020-01-01')
 AND supplier_code IN
(SELECT supplier_code
 FROM API_StockAndSaleHeader
 WHERE dbo.ConvertStringToDate(period_start_date) = '2019-12-01')
 AND supplier_code IN
(SELECT supplier_code
 FROM API_StockAndSaleHeader
 WHERE dbo.ConvertStringToDate(period_start_date) = '2019-11-01')

Ответы [ 2 ]

0 голосов
/ 26 мая 2020
    CREATE TABLE #API_StockAndSaleHeader 
    (
        supplier_code int,
        period_start_date DATETIME
    )

    INSERT INTO #API_StockAndSaleHeader (supplier_code, period_start_date) VALUES
    (1, '2020-05-01'),
    (1, '2020-04-01'),
    (1, '2020-04-15'), -- This one should not show up.
    (2, '2020-05-01'),
    (2, '2020-04-01'),
    (2, '2020-03-01'), -- This one should show up.
    (2, '2020-02-01'),
    (2, '2020-01-01')

    DECLARE @months int = 3

    SELECT supplier_code 
    FROM 
    (
        SELECT supplier_code, DATEPART(year, period_start_date) as [Year], DATEPART(month, period_start_date) as [month]--DISTINCT supplier_code
        FROM #API_StockAndSaleHeader 
        WHERE DATEADD(MONTH, @months, period_start_date) >= GETDATE()
        GROUP BY supplier_code, DATEPART(year, period_start_date), DATEPART(month, period_start_date)
    ) A
    GROUP BY supplier_code
    HAVING COUNT(supplier_code) >= @months

    IF(OBJECT_ID('tempdb..#API_StockAndSaleHeader') IS NOT NULL)
    BEGIN
        DROP TABLE #Temp
    END
0 голосов
/ 26 мая 2020

Это даст вам поставщиков, у которых есть хотя бы одна запись для каждого из последних 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 месяцев.

...