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 存储过程中查找表名的列名作为保留关键字