sql - 从Excel到sql表的非结构化分组数据

标签 sql sql-server excel ssis etl

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 列的分组。

最佳答案

以下是解决该问题的方法:

1.像这样在数据库中创建临时表。请记住,插入时需要有“身份”列:

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

解决方案可能不是很漂亮,但易于理解/更改/调试

关于sql - 从Excel到sql表的非结构化分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54382185/

相关文章:

mysql - 用三个表计数分组

mysql - 从 IN() 函数排序 sql 结果

sql - MySQL 查询(混合插入和选择)

c# - 我需要使用 MultipleActiveResultSets 功能吗?

sql-server - 无法使用 Entity Framework 5.0 在远程服务器上创建数据库

excel - 如何在运行时 VBA 显示 UDF 的工具提示?

java - SQL Server JDBC 异常

sql-server - 编写此查询的更有效方式?

excel - Excel中的多个If条件

vba - Application.Cells VS Application.ActiveSheet.Cells