Как разбить таблицу на Master / Detail, сгенерировав идентификатор SSIS? - PullRequest
1 голос
/ 22 июня 2019

Я сохранил плоский файл в таблицу.

тег P для мастера Тег I для детализации

Всегда строке P предшествовало (n) число строк I.

Проблема в том, что у строк I нет идентификатора для присоединения к строке P.

Необходимо сгенерировать идентификатор для соединения строки P со строками I.

В строке P есть два поля, которые могут быть полезны. В поле «SequenceNumber» хранится последовательный идентификатор. Поле «NumberOfItems» хранит информацию о том, сколько строк I принадлежит строке P.

Мне нужно разделить данные на две таблицы мастер / деталь с идентифицирующим идентификатором. Я прилагаю изображение с данными

Большое спасибо


Original Table
RecordType SequenceNumber NumberOfItems TicketHeaderKey UnitID
P          1              3             ;               1
I          19900          0             FA              19900
I          3000           0             BK              3000
I          0              0             BK              0
P          2              1             ;               1
I          19900          0             FA              19900
P          3              2             ;               1
I          19900          0             FA              19900
I          3000           0             BK              3000

Need Split into two tables some like this

Master Table
RecordType SequenceNumber NumberOfItems TicketHeaderKey UnitID
P          1              3             ;               1
P          2              1             ;               1
P          3              2             ;               1

Detail Table
RecordType SequenceNumber idMasterTable TicketHeaderKey UnitID
I          19900          1             FA              19900
I          3000           1             BK              3000
I          0              1             BK              0
I          19900          2             FA              19900
I          19900          3             FA              19900
I          3000           3             BK              3000

SQL ТАБЛИЦА ДЛЯ РАЗДЕЛЕНИЯ

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Я не уверен в данных, которые вы хотите вставить в каждую из основных и подробных таблиц, но вот один из способов сделать это.

Для MasterTable:

INSERT INTO MasterTable
SELECT 
    SequenceNumber AS id, 
    UnitId, 
    NumberOfItems, 
    TicketHeaderKey, 
    PrintType 
FROM tabletosplit 
WHERE RecordType = 'P' 
ORDER BY SequenceNumber;

Для подробной таблицы:

WITH auxtable(id, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType, auxnumber, parentNumberOfItems, parentid) 
AS (
SELECT 1, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType, 1, NumberOfItems, SequenceNumber 
FROM tabletosplit WHERE SequenceNumber = 1
UNION ALL
SELECT
    auxtable.id + 1,
    T.RecordType, T.UnitId, T.SequenceNumber, T.NumberOfItems, T.TicketHeaderKey, T.PrintType, 
    CASE WHEN T.RecordType = 'P' THEN 1 else auxtable.auxnumber + 1 END, 
    CASE WHEN T.RecordType = 'P' THEN T.NumberOfItems ELSE auxtable.parentNumberOfItems END, 
    CASE WHEN T.RecordType = 'P' THEN T.SequenceNumber ELSE auxtable.parentid END 
    FROM auxtable 
    INNER JOIN (Select ROW_NUMBER() OVER(ORDER BY (SELECT NULL))  AS id, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType
                FROM tabletosplit 
                WHERE SequenceNumber <> 1) AS T
    ON auxtable.id = T.id 
)
INSERT INTO DetailTable
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS id, auxtable.UnitId , auxtable.TicketHeaderKey, auxtable.PrintType, auxtable.Parentid, auxtable.auxnumber -1 as DetailIndex
FROM auxtable
WHERE auxtable.RecordType = 'I';

Результаты:

enter image description here

Рабочий образец здесь Надеюсь, это поможет вам.

0 голосов
/ 22 июня 2019

Моя основная проблема в том, что у вас нет правильной последовательности строк в исходной таблице.Без этого невозможно GTD упорядочить набор данных.

В ожидании того, что вы исправите это, я добавил столбец с именем RowSeq

Пример или dbFiddle

Declare @OriginalTable Table ([RowSeq] int,[RecordType] varchar(50),[SequenceNumber] int,[NumberOfItems] int,[TicketHeaderKey] varchar(50),[UnitID] varchar(50))
Insert Into @OriginalTable Values 
 (1,'P',1,3,';',1)
,(2,'I',19900,0,'FA',19900)
,(3,'I',3000,0,'BK',3000)
,(4,'I',0,0,'BK',0)
,(5,'P',2,1,';',1)
,(6,'I',19900,0,'FA',19900)
,(7,'P',3,2,';',1)
,(8,'I',19900,0,'FA',19900)
,(9,'I',3000,0,'BK',3000)


Select RecordType
      ,SequenceNumber
      ,NumberOfItems
      ,TicketHeaderKey
      ,UnitID
 From  @OriginalTable
 Where RecordType='P'
 Order By [RowSeq]


Select RecordType
      ,SequenceNumber
      ,IDMasterTable 
      ,TicketHeaderKey
      ,UnitID
 From ( 
        Select *
              ,IDMasterTable = max(case when RecordType='P' then SequenceNumber end ) over (Order By RowSeq)
         From  @OriginalTable
      ) A      
 Where RecordType='I'
 Order By [RowSeq]

Возвращает

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...