Вставить одну строку данных в несколько строк таблицы - PullRequest
1 голос
/ 13 марта 2020

Краткое содержание: Как написать код SQL для вставки одной записи из плоского файла в отдельные записи для вставки в таблицу SQL Server.

Особенности: У меня есть таблица для записи арендные платежи. Для каждого договора аренды датой исполнения всегда является первый день месяца. В таблице указана запись за каждый месяц на весь срок аренды. Для простоты предположим, что существует договор аренды, который действует с 1 сентября 2019 года по 31 августа 2020 года. Таблица будет выглядеть следующим образом:

+------------------------------------------------------+
| CONTRACT_ID | DUE_DATE_DT | INVOICE_ID | RENTAL_AMT  |
+-------------+-------------+------------+-------------+
| 12345       |    9/1/2019 |            |             |
+-------------+-------------+------------+-------------+
| 12345       |   10/1/2019 |            |             |
+-------------+-------------+------------+-------------+
...
+-------------+-------------+------------+-------------+
| 12345       |    8/1/2020 |            |             |
+-------------+-------------+------------+-------------+

Счета обычно рассчитаны на один календарный месяц, но иногда может быть два или три месяца, потому что продавец играет в догонялки. Данные поступают в плоский файл, образец будет выглядеть следующим образом:

Contract  Rental Period From Date  Rental Period To Date  Invoice Number   Amount
31125      9/1/2019                  9/30/2019             6378            400.00  (standard scenario)
12345      9/1/2019                 11/30/2019             789             150.00  (multi-month scenario)

Данные из плоского файла должны храниться в трех отдельных записях в таблице:

+------------------------------------------------------+
| CONTRACT_ID | DUE_DATE_DT | INVOICE_ID | RENTAL_AMT  |
+-------------+-------------+------------+-------------+
| 12345       |    9/1/2019 |   789      |   50.00     |
+-------------+-------------+------------+-------------+
| 12345       |   10/1/2019 |   789      |   50.00     |
+-------------+-------------+------------+-------------+
| 12345       |   11/1/2019 |   789      |   50.00     |
+-------------+-------------+------------+-------------+

Заранее спасибо.

1 Ответ

1 голос
/ 13 марта 2020

Вы можете попробовать использовать рекурсивный CTE. Учтите это:

CREATE TABLE #RawData(Contract int, Rental_Period_From Date, Rental_Period_To Date, Invoice_Number int, Amount Decimal(10,2))
INSERT INTO #RawData VALUES(31225, '9/1/2019','9/30/2019', 6378,400.00)
INSERT INTO #RawData VALUES(12345, '9/1/2019','11/30/2019', 789,150.00)


;WITH CTE
AS
(
select Contract,Rental_Period_From DueDate,Invoice_Number,Amount, 0 MonthCounter, Rental_Period_To from #RawData
UNION ALL
SELECT Contract, DATEADD(month,MonthCounter+1,DueDate),Invoice_Number,Amount, MonthCounter,Rental_Period_To   from CTE
WHERE DATEADD(month,MonthCounter+1,DueDate) <= Rental_Period_To

)
SELECT CONTRACT, DueDate,Invoice_Number, CAST(Amount / (SELECT COUNT(*) 
                FROM CTE t1 WHERE t1.Contract = t2.Contract ) as decimal(10,2)) Amount 
FROM CTE t2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...