Мне нужно взять сводку счетов и детали из двух таблиц в одной базе данных в две таблицы в другой базе данных. Я не могу манипулировать столбцами в любой таблице, так как они являются проприетарным программным обеспечением и требуют, чтобы таблицы работали должным образом. Часто на один счет накладывается более одной строки детализации.
В первой таблице строки отличаются itemid
для каждой детали, которая является первичным ключом. Во второй таблице несколько подробных записей для одного счета-фактуры различаются столбцом с именем Sequence
. Этот столбец имеет тип varchar(3)
, и значения должны быть от 001
до 999
.
Для каждого счета-фактуры последовательность перезапускается с 001. В моей ситуации большинство счетов-фактур имеют от 1 до 50 записей сведений. Потенциал для нескольких больше, но не норма.
Пожалуйста, посмотрите образец требуемых результатов на этом изображении. Обратите внимание, что каждый номер счета-фактуры имеет упорядоченные детали 001, 002,003 и т. Д. c.
данные счета-фактуры во второй базе данных
Я упростил вставку здесь, включив только поля, имеющие отношение к проблеме. Я включил вкладыш для сводки счетов, а также детали. Тем не менее, моя единственная проблема связана с полем последовательности при вставке деталей счета. Все остальные столбцы переносятся нормально.
INSERT INTO [spectrum].[dbo].[CR_INVOICE_HEADER_MC] ([Company_Code],[Customer_Code], [Invoice_Or_Transaction], [Transaction_Type], [Job_Number],[Invoice_Date]
SELECT
'WST' as Company_code, Customer,
RIGHT((' ' + a.InvoiceNumber), 10) AS Invoice_or_transaction,
'I' as Invoice_Type,
RIGHT((' ' + a.Job), 10) AS job_number,
InvoiceDate AS Invoice_Date
FROM
[CommandCenter].[dbo].[Invoices] a
LEFT OUTER JOIN
[CommandCenter].[dbo].[Jobs] j ON j.job = a.Job
WHERE
a.posted = '1'
AND a.invoicedate BETWEEN '20200101' AND '20200131';
INSERT INTO [spectrum].[dbo].[CR_INVOICE_DETAIL_MC] ([Company_Code], [Customer_Code], [Invoice_Or_Transaction], [Transaction_Type], [Sequence]
SELECT
'WST' AS [Company_Code], A.CUSTOMER AS Customer_Code,
A.InvoiceNumber AS Invoice_or_transaction, 'I' AS Transaction_type,
CASE
WHEN ISNULL((SELECT MAX ([Sequence])
FROM [Spectrum].dbo.CR_INVOICE_DETAIL_MC
WHERE Invoice_Or_Transaction = b.invoiceid), '0') = '0'
THEN '001'
ELSE RIGHT('000' + (SELECT CAST(MAX(sequence) + 1 AS VARCHAR(3))
FROM [Spectrum].dbo.CR_INVOICE_DETAIL_MC
WHERE Invoice_Or_Transaction = b.invoiceid), 3)
END AS SEQUENCE
FROM
[CommandCenter].[dbo].[Invoices] A
LEFT OUTER JOIN
[CommandCenter].[dbo].[InvoiceItems] B ON A.InvoiceID = B.InvoiceID
WHERE
a.posted = '1'
AND a.invoicedate BETWEEN '20200101' AND '20200131'
Это не меняет порядковый номер для каждой записи. Если во второй базе данных нет подробностей для счета-фактуры, будет установлена последовательность '001' для всех записей, вставленных в одну команду вставки. Если записи уже существуют, он установит порядковый номер один выше и сделает его одинаковым для всех вставок. См. Примеры результатов ниже.
Добавлена первая подробная запись для двух счетов
Добавлена более подробная запись для тех же двух счетов