我目前正在使用SQL Server 2014实现数据仓库,我正在努力维护维度表的布局,以及更多的数据提取。我有一个Excel文件,格式如下:
+--------+---------+------------+------------+------------+---+-------------+
| Region | Country | Location | Question 1 | Question 2 | … | Question 97 |
+--------+---------+------------+------------+------------+---+-------------+
| Africa | Algeria | Location 1 | Yes | Yes | … | No |
| Africa | Algeria | Location 2 | No | Yes | … | Yes |
+--------+---------+------------+------------+------------+---+-------------+
还有一些关于何时回答问题的属性。如点所示,有超过3个问题,实际上有97个问题。 目前我已将excel文件导入到我的原始表中,该原始表表示我的准备区域(它具有与excel文件完全相同的格式,第一行作为标题)。现在,当我想把数据放到舞台上时,我在布局上有点挣扎。所以我考虑了布局,因为我的老板告诉我将来可能会改变问题,我想出了以下两个表:
+------------+---------------------+
| DIM_Questionnaire |
+------------+---------------------+
| PK | SUR_QuestionnaireID |
| FK | LocationID |
| FK | TimeKey |
+------------+---------------------+
+--------------+-----------------+
| DIM_Question |
+--------------+-----------------+
| PK | SUR_QuestionID |
| FK | QuestionnaireID |
| | Question |
| | Answer |
| | Category |
+--------------+-----------------+
然后将调查添加到事实表中。您如何看待仓库中的此解决方案?此外,我如何能够将原始表中的列名作为问题表中的值?
答案 0 :(得分:1)
我认为你已经找到了一个很好的解决方案。正如您所提到的,第一个布局并不是很好,因为每次调查的问题数量可能会发生很多变化,例如,如果您有97个问题列,如果您要求保留100个问题,则必须更改表格结构体。如果问题大约是20,你会不必要地浪费很多列。找出结构的好工作。
你的结构对我来说很好看。我想向你澄清一件事情吗? DIM_Question表中的答案是正确答案吗?用户提供的答案应该转到另一个包含DIM_Question SK的答案表,以便您可以随时将答案与问题维度上的确切问题相关联。
还有一件事,为什么要将调查表添加为事实表?我认为你的措施是"答案"对?例如,如果有人要求"他们中有多少人正确回答了这个问题?","人们为这个问题提供了什么类型的答案?"等我认为你应该仔细检查。如果你遇到困难,只需提供一些实际要求的点击,这样我们就可以搞清楚了。
最后是你的下一个问题"我怎样才能将raw-table中的列名作为Question表中的值? "我想你可以从下面的查询中获取表列名称
SELECT *
FROM <database_name>.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Dim_Table'
希望这有帮助。
答案 1 :(得分:0)
如果您的目标是使用SSIS在行中转换列,则可以使用“Unpivot”任务。
请参阅此article将以简单的方式描述如何使用Pivot和Unpivot转换组件。
答案 2 :(得分:0)
您的术语意味着什么并不完全清楚。似乎有多个调查(回收问卷的集合,每个调查问卷都有相同的问题)。但是,你的调查维度肯定应该有一个问卷ID的FK吗?
您的Dim Question的结构与此不一致。根据FK to QuestionnaireID,调查问卷似乎是“班级”(向多人发送的一组问题)。那么什么是“班级的实例”(一组问题的具体副本,由一个人回答)?
我认为你的事实应该是答案,维度问题,(可能)调查,问卷调查(可能是维度问题的属性)。但我不能完全确定这一点(除了答案绝对是事实),因为我不确定你是如何使用这些术语的。