对非SQL设计的表的更改

时间:2019-02-21 13:15:36

标签: sql sql-server-2008

我应该根据其他文件对巨大的CSV文件进行一些更改。因此,我选择在SQL中进行此操作,但经过进一步考虑后,我不确定如何继续进行操作。

在第一张表中,我有一份合同清单。列代表合同所属的某些细分市场以及可以链接到合同的某些产品(下表中的示例)。 这里合同号1234属于段X1和Y2。没有链接到的产品编号1,但是有链接到产品编号2的产品。该产品的原产于2030年1月1日结束。

cont_n|date|segment_1|segment_2|..|prod_1|date_prod_1|product_2|date_product_2|..
1234  |3011| X1      | Y2      |..|      |           |YES      |01/01/2030    |.. 

第二个文件是段组合的列表,并指示应如何调整“日期”列。该示例显示了以下情况-如果存在与属于组X1和Y2的合同链接的prod_2,则在今年结束prod_2。我需要此结果来更改表号。 1.

prod_no|segment_1|segment_2|result
prod_2 | X1      | Y2      | end the product on anniversary

Ergo,我需要得到结果:

cont_n|date|segment_1|segment_2|..|prod_1|date_prod_1|product_2|date_product_2|..
1234  |3011| X1      | Y2      |..|      |           |YES      |30/11/2019    |..

在原始文件中,表1中有大约60万行和300列(意味着大约有100种不同的产品),表2中有800种可能的段组合。

我需要实现的算法(通常):

for x=1 to 100
IF product_x = YES THEN date_product_x = date + "Seach for result in table2"  

是否有合理的方法基于第二张表更改“ date_product_x”列,还是找到其他解决方案更好?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我只能为您提供一般性的方法,因为您问题中的信息是一般性的(例如,为什么“在周年纪念日结束产品”转换为“ 30/11/2019”?问题中未作解释,所以我认为您将能够处理逻辑的那一部分。

您可以通过在表1上使用UNPIVOT来获得如下结构:

cont_n   |   segment1   |   segment2   |   product_number   |   product_date

您将通过date_product_1date_product_100进行UNPIVOT..FOR。您要么必须输入所有100个列名,要么使用动态sql来构建整个列表。

您将进行一些字符串操作以获取“ date_product_x”的“ x”部分,并将其转换为“ prod_x”,然后可以在两个segment列和“ prod_x”列,获取result列的值,并执行您要执行的任何规则以获取date_product_x所需的值。

最后,您得到该结果,并将其PIVOT返回到每合同单行形式,然后将其联接到原始表中以更新date_product_x列。