SQL 从包含表名、列名和值列映射的数据表中将数据插入到多个表中,可以在源中更改

Posted

技术标签:

【中文标题】SQL 从包含表名、列名和值列映射的数据表中将数据插入到多个表中,可以在源中更改【英文标题】:SQL Insert data into multiple tables from data table that contains table name, column name and value column mapping can change in source 【发布时间】:2021-07-21 20:58:54 【问题描述】:

我很困惑。这看起来可行,但不确定如何实现。 我有一个看起来像这样的数据表。数据源有时会 交换源文件中的列。

Data                            
    IN      column          table_sheet          y      w       value   
    col1    Route           Summary              2021   Week 1  a   
    col2    CNG/Diesel      Summary              2021   Week 1  5           
    col3    Freq            Summary              2021   Week 1  B       
    col4    Weekly Miles    Summary              2021   Week 1  6       
    col1    CNG/Diesel      Summary              2021   Week 2  1       
    col2    Freq            Summary              2021   Week 3  1       
    col3    Weekly Miles    Summary              2021   Week 4  1       
    col1    Load            Days_ON              2021   Week 1  L210224-25048   
    col2    Load_id         Days_ON              2021   Week 1  L210224-25048
    col3    cost            Days_ON              2021   Week 1  263.64  
    col1    Distance        CCD                  2021   Week 2  781.62      
    col2    Code            CCD                  2021   Week 2  CL      
    col3    Name            CCD                  2021   Week 2  Squre       
    col4    Cost            CCD                  2021   Week 2  1800 

源文件是一个包含多个工作表(项目的表名称)的电子表格,每周填充一次并且是增量的。 源文件列映射可以更改,如表摘要中一样,源中的所有列(excel 源文件列索引)都已更改。目标表已经存在所有可能的列名。 SQL 代码必须读取表名并相应地将数据映射到源表。

I want to populate the below tables using the data table above like this.               
Summary     Route    CNG/Diesel Freq    Weekly Miles    y       W
            a        5          B       6               2021    Week 1
                     1                                  2021    Week 2
                                1                       2021    Week 3
                                        1               2021    Week 4
                            
Days_ON                 
        Load            LoaD_id         cost    y          W
        L210224-25048   L210224-25048   263.64  2021       Week 1   
                            
                            
CCD                         
        Distance        Code    Name        Cost    y       W
        781.62          CL      Squre       1800    2021    Week 1  

添加- 该解决方案可能适用于一行,但不适用于同一周的多行。

Data                
IN      column           table_sheet     y      w     value h1_ind
    col1    Route        Summary        2021    Week 1  a   2
    col2    CNG/Diesel   Summary        2021    Week 1  5   3
    col3    Freq         Summary        2021    Week 1  B   4
    col4    Weekly Miles Summary        2021    Week 1  6   5
    col1    Route        Summary        2021    Week 1  b   2
    col2    CNG/Diesel   Summary        2021    Week 1  1   3
    col3    Freq         Summary        2021    Week 1  1   4
    col4    Weekly Miles Summary        2021    Week 1  1   5
    col1    Route        Summary        2021    Week 1  c   2
    col2    CNG/Diesel   Summary        2021    Week 1  5   3
    col3    Freq         Summary        2021    Week 1  B   4
    col4    Weekly Miles Summary        2021    Week 1  6   5
    col1    Route        Summary        2021    Week 1  d   2
    col2    CNG/Diesel   Summary        2021    Week 1  1   3
    col3    Freq         Summary        2021    Week 1  1   4
    col4    Weekly Miles Summary        2021    Week 1  1   5

Desired output:
table_sheet    y      w      Route CNG/Diesel  Freq  Weekly Miles
Summary       2021   Week 1   a       5         B     6
Summary       2021   Week 1   b       1         1     1
Summary       2021   Week 1   c       5         B     6
Summary       2021   Week 1   d       1         1     1

如果可能,SQL unpivot 如何提供此输出?我想看看这个。 我也想看看我们能不能让勺子工作。 请帮忙。

【问题讨论】:

【参考方案1】:

您需要通过 table_sheet 分隔行,然后为每个 table_sheet 应用 Row 非规范化器,因为您生成不同的表:

【讨论】:

这不适用于多行:见上文 - 已添加 - 请帮助 好的,这不起作用,因为您没有“唯一键”来非规范化表,您想要实现的目标只有在您按顺序接收(并读取)行时才有效,如果您将行混合,它将不起作用。如果行是有序的,您可以添加一个计数器,该计数器仅在您获得 table_sheet、y、w 和 Route 的新值时才会更改,但与 CNG、Freq 和 Weekly Miles 的其余部分保持相同,它将需要一些添加它的复杂逻辑。一旦你有了它,你就可以在反规范化步骤中将计数器添加到 Group 字段中。

以上是关于SQL 从包含表名、列名和值列映射的数据表中将数据插入到多个表中,可以在源中更改的主要内容,如果未能解决你的问题,请参考以下文章

从 PersistEntity/PersistField 映射到 DB 中的列名和表名的规则是啥

在 SQL Server 存储过程中查找表名的列名作为保留关键字

SQL语句

Oracle SQL 从执行计划中检索具有表名的列名作为表

在oracle SQL developer中从查询列名中查找表

从列名确定表名[重复]