Неструктурированная группировка данных из Excel в таблицу SQL - PullRequest
0 голосов
/ 26 января 2019

enter image description here

date    code    employee    type    total   actual
12-12-2018  ltsdysa 3026262 general 150 139
            typical 200 177
            dummy   120 100
14-12-2018  hskdbegs    3630878 new 300 143
            typical 100 99
        4829264 dummy   210 187
            general 130 89
            typical 200 200
18-12-2018  tuebdhxj    3637980 old 300 143
            typical 100 99
        4833390 general 300 260
            typical 130 89
            new 200 200

Привет всем, я хочу импортировать данные Excel в таблицу SQL. Пример данных приведен на рисунке выше. Мне нужно вставить данные даты, кода, данных столбца сотрудника в столбец соответствующего типа.

Ожидаемый результат

enter image description here

Можете ли вы помочь мне с задачами ssis. Как будто мне нужно разгруппировать первые 3 столбца.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

В SSIS этого можно достичь с помощью компонента Script:

  1. Добавление задачи DataFlow
  2. В задаче потока данных добавьте источник Excel, компонент сценария и пункт назначения OLEDB
  3. В компонент Script добавьте 3 новых выходных столбца (outdate, outcode и outemployee), имеющих те же типы данных, что и исходные столбцы
  4. В компоненте «Сценарий» выберите Visual Basic в качестве языка сценариев
  5. В редакторе скриптов напишите следующий код:

    Private Lastdate as string
    Private LastEmployee as string
    Private Lastcode as string
    
    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    
    If Not Row.date_IsNull Then
    
        Row.outdate = Row.date
        Lastdate = Row.date
    Else
    
        Row.outdate = Lastdate
    
    End If
    
    If Not Row.employee_IsNull Then
    
        Row.outemployee = Row.employee
        Lastemployee = Row.employee
    Else
    
        Row.outemployee = Lastemployee
    
    End If
    
    If Not Row.code_IsNull Then
    
        Row.outcode = Row.code
        Lastcode = Row.code
    Else
    
        Row.outcode = Lastcode
    
    End If
    
    
    
    
    End Sub
    
  6. Сопоставить новые созданные столбцы и столбцы type, total и actual с соответствующим столбцом назначения

0 голосов
/ 26 января 2019

Вот как вы должны решить эту проблему:

1. Создайте промежуточную таблицу в вашей БД следующим образом. Имейте в виду, что вам нужно иметь столбец Identity при вставке:

CREATE TABLE tbl_Excel_stg (
    ID INT IDENTITY(1,1),
    [Date] VARCHAR(50),
    code VARCHAR(50),
    Employee VARCHAR(50),
    [type] VARCHAR(50),
    total VARCHAR(50),
    actual VARCHAR(50)
)

2.Создайте пакет служб SSIS для загрузки данных Excel в промежуточную таблицу.

3. Выполните следующий запрос для извлечения исправленных данных (я включил некоторые данные для целей тестирования)

INSERT INTO tbl_Excel_stg ([Date],code,Employee,type,total,actual)
VALUES ('2018-12-12','Itsdysa','3026262','general','150','139');
GO
INSERT INTO tbl_Excel_stg ([Date],code,Employee,type,total,actual)
VALUES ('','','','typica','200','177');
GO
INSERT INTO tbl_Excel_stg ([Date],code,Employee,type,total,actual)
VALUES ('','','','dummy','120','100');
GO
INSERT INTO tbl_Excel_stg ([Date],code,Employee,type,total,actual)
VALUES ('2018-12-14','hskdbegs','3630878','new','300','143');
GO
INSERT INTO tbl_Excel_stg ([Date],code,Employee,type,total,actual)
VALUES ('','','','typical','100','99');
GO
INSERT INTO tbl_Excel_stg ([Date],code,Employee,type,total,actual)
VALUES ('','','4829264','dummy','210','187');
GO
INSERT INTO tbl_Excel_stg ([Date],code,Employee,type,total,actual)
VALUES ('','','','general','130','89');
GO

SELECT [Date] = CASE s0.[Date] WHEN '' THEN s1.[Date] ELSE s0.[Date] END
    , code = CASE s0.code WHEN '' THEN s1.code ELSE s0.code END
    , Employee = CASE s0.Employee WHEN '' THEN s1.Employee ELSE s0.Employee END
    , s0.type, s0.total, s0.actual
FROM tbl_Excel_stg as s0
OUTER APPLY (
    SELECT ID = MAX(si.ID) FROM tbl_Excel_stg as si
    WHERE si.ID < s0.ID and si.[Date] != ''
) as sDate
OUTER APPLY (
    SELECT ID = MAX(si.ID) FROM tbl_Excel_stg as si
    WHERE si.ID < s0.ID and si.code != ''
) as scode
OUTER APPLY (
    SELECT ID = MAX(si.ID) FROM tbl_Excel_stg as si
    WHERE si.ID < s0.ID and si.Employee != ''
) as sEmployee
LEFT JOIN tbl_Excel_stg as s1 ON s1.ID = sDate.ID
LEFT JOIN tbl_Excel_stg as s2 ON s2.ID = scode.ID
LEFT JOIN tbl_Excel_stg as s3 ON s3.ID = sEmployee.ID
ORDER BY s0.ID

Решение может быть не очень красивым, но простым для понимания / изменения / отладки

...