我有一个非常宽的非规范化表(如果你可以这样说),选项列达到 100+
Year ProductID ProductName Option1 Option2 Option3 ....Option100
-----------------------------------------------------------------
2016 1 Test1 A1 A1a A3
2015 1 Test1 A1 A2 A2a
问题是我们有动态查询试图确定选项列,然后在其中找到选项值
IE
@SQL= 'SELECT Option' + @getOptionNum +' FROM ProductMapping
理想情况下,我希望将其转换为这样的东西
Year ProductID ProductName OptionName
-------------------------------------
2016 1 Test1 Option1
2016 1 Test1 Option2
2016 1 Test1 Option3
2015 1 Test1 Option1
2015 1 Test1 Option2
2015 1 Test1 Option3
OptionID OptionName OptionValue Year
-------------------------------------
1 Option1 A1 2016
2 Option2 A1a 2016
3 Option3 A3 2016
4 Option1 A1 2015
5 Option2 A2 2015
6 Option3 A2a 2015
SELECT *
FROM ProductMapping map
LEFT JOIN OptionList list ON map.OptionName = list.OptionName
AND map.Year = list.Year
AND map.OptionName = 'Option1'
我遇到的问题是如何通过查询将该宽表转换为两个表结构,因为它有很多列和行,我无法手动规范所有这些。
是的,我也理解理想情况下,第二个表需要进一步规范化,以将 Option1...Option3 保存在单独的表中,并将 Option1..A1 映射保存在单独的表中,但这是一个开始......
希望这个简单的例子能阐明以下事实
- Option1...100 列需要在单独的表中进行规范化
- 映射到值的选项列每年都会发生变化
有什么想法吗?