У меня есть две таблицы: таблица 1 и таблица 2.
Table1 :
ID Type StartDate EndDate Units
AAA 1 4/3/2018 4/7/2018 1
AAA 1 4/8/2018 4/21/2018 1
AAA 1 1/8/2017 2/6/2017 2
AAA 1 1/1/2017 1/7/2017 2
BBB 2 7/16/2017 7/22/2017 1
BBB 2 8/1/2017 8/1/2017 1
Table 2:
ID Type StartDate EndDate
AAA 1 01/02/2017 01/17/2017
AAA 1 01/02/2017 01/17/2017
AAA 1 01/02/2017 01/17/2017
AAA 1 01/02/2017 01/17/2017
AAA 1 02/01/2017 02/28/2017
AAA 1 02/01/2017 02/28/2017
AAA 1 02/01/2017 02/28/2017
AAA 1 02/01/2017 02/28/2017
AAA 1 02/01/2017 02/28/2017
AAA 1 04/03/2018 04/03/2018
AAA 1 04/10/2018 04/10/2018
BBB 2 07/20/2017 07/21/2017
BBB 2 08/01/2017 09/01/2017
Мне нужно посмотреть (таблица2. Начальная дата между датами начала и окончания таблицы1) Или (конечная дата таблицы2 между датой начала таблицы1 и датой окончания)и зациклите и отметьте Table2 = Y для количества единиц в таблице1 в этом диапазоне.
My Expected output is :
ID Type StartDate EndDate Flag
AAA 1 01/02/2017 01/17/2017 Y
AAA 1 01/02/2017 01/17/2017 Y
AAA 1 01/02/2017 01/17/2017 Y
AAA 1 01/02/2017 01/17/2017 Y
AAA 1 02/01/2017 02/28/2017 N
AAA 1 02/01/2017 02/28/2017 N
AAA 1 02/01/2017 02/28/2017 N
AAA 1 02/01/2017 02/28/2017 N
AAA 1 02/01/2017 02/28/2017 N
AAA 1 04/03/2018 04/03/2018 Y
AAA 1 04/10/2018 04/10/2018 Y
BBB 2 07/20/2017 07/21/2017 Y
BBB 2 08/01/2017 09/01/2017 Y
Я должен рассмотреть диапазоны ID, типа и даты для этих двух таблиц.Я должен проверить table2 против table1 для даты начала Table2 и даты окончания Table2.Может ли кто-нибудь помочь мне с этим циклом?
Вот код для этого.
SELECT ROW_NUMBER() OVER(
ORDER BY id, StartDate, EndDate) AS AID, StartDate
id , units, StartDate, EndDate, [Type], Flag
INTO #tempA
FROM #table1;
SELECT ROW_NUMBER() OVER( ORDER BY ID, StartDate, EndDate, Type,Flag) AS CID,
ID, StartDate, EndDate, Type, Flag
INTO #tempC
FROM #table2;
SELECT a.AID
, c.CID
, a.ID
INTO #tempCombined
FROM
#tempA a CROSS JOIN #tempC c
WHERE a.ID = c.ID
AND a.Type = c.Type
AND ((c.StartDate BETWEEN a.StartDate AND a.EndDate)
OR (c.EndDate BETWEEN a.StartDate AND a.EndDate))
ORDER BY a.Aid , c.CID
DECLARE @List TABLE
(
Aid INT,
Cid INT,
ID Varchar(50)
)
DECLARE @count INT, @countMax INT, @Unit INT
SET @count = 1
SELECT @countMax = MAX(aid)
FROM #tempA
-- get @List which CIDs to be proved
WHILE @count <= @countMax
BEGIN
SELECT @Unit = units
FROM #tempA
WHERE aid = @count
SET ROWCOUNT @Unit
INSERT INTO @List (Aid , Cid , ID)
SELECT ac.AID , ac.CID , ac.ID
FROM #tempCombined ac
WHERE ac.AID = @count
AND ac.CID not in (select cid from @List where ID=ac.ID)
order by cid,ID
SET ROWCOUNT 0
SET @count+=1
END
UPDATE c
SET
c.UpdateFlag = 'Y'
FROM #tempC c
INNER JOIN @List cl
ON c.CID = cl.Cid
SELECT *
FROM #tempC