【发布时间】:2013-03-28 10:21:25
【问题描述】:
第一次在这里发帖...请原谅格式问题。经过几天的尝试寻找类似的情况来解决我的问题,我仍然发现自己在魔方中。我正在尝试创建一份“报告”,以显示学生在考试中的表现及其人口统计数据。这是场景:
我有一个包含以下列的考试源表:
表名:FOT2012PRE
ItemID int(主键)
ItemNum nchar(10)(结果表中对应的列名)
ItemStem nvarchar(1000) (这是问题词干。)
IC1 nvarchar(1000) (这是第一个答案选择。)
IC2 nvarchar(1000) (这是第二个答案选择。)
IC3 nvarchar(1000) (这是第三个答案选择。)
IC4 nvarchar(1000) (这是第四个答案选择。)
PriAns nvarchar(10) (这是正确的答案选择 - N/A for 人口统计项目。)
还有用于标识图形、视频、课程、单元、演示标志的附加列。
这是考试源表中的一些数据:
ItemID ItemNum ItemStem IC1 IC2 IC3 IC4 PriAns
1 Item1 什么 你现在的年级是?九年级 十年级 十一年级 十二年级 Grade NULL
2 Item2 你的性别是? 男 女 NULL NULL NULL
当学生回答每个问题时,他们的选择会记录在该考试特定的结果表中。此结果表包含以下列:
表名:FOT2012PRERESULTS
ResultsID int(主键)
StudentID nvarchar(255)(每位参加考试的学生的唯一 ID)
LastItem nvarchar(255) (更新处理的每个答案 - 用于考试 重新输入)
Item1 nvarchar(255) (为 Item1 记录的答案: “C”如果正确;如果不正确则选择)
Item2
nvarchar(255) (为第 2 项记录的答案:与所有其他的相同 考试中的问题)
这里有一些来自结果表的示例数据:
ResultsID StudentID LastItem Item1 Item2 Item3
743 MD911059935 67 IC2 IC2 C
744 IC2 IC2 C
746 MD911059949 67 IC2 IC2 IC4
934 MD3590986869 46 IC2 IC1 IC3
最终我希望我的报告看起来像这样:
项目:您目前的年级是多少?
9 年级(IC1 响应数)
10 年级(数 IC2 响应数)
11 年级(IC3 响应数)
12 年级(IC4 响应数)
无响应(数 NULL 响应)
这些结果将采用表格的形式,并在本地、地区、州和国家的基础上比较结果,但我可以执行相应的嵌套查询来处理它。对于这个解决方案,我持开放态度并相信它可能最好作为存储过程来实现,因为大约有 40 场考试分布在许多州和数千名学生中。我可以根据需要传递表名和其他值。根据为特定班级进行的考试,对报告的访问是个性化的。
感谢任何帮助和建议。我必须恭敬地请求您提供有关任何连接或支点的细节。我是 ASP JavaScript 中的恐龙和程序。到目前为止,我在这条路上的尝试只让我进入了这个立方体……我需要一些光线来找到我的出路。如果我遗漏了什么,请告诉我。
谢谢...
更新:
这是我创建的 SP 的一部分,用于将数据规范化到一个表中:
Create Table #rawtemp
(
Choice nchar(5),
ChoiceCount float
)
Create Table #temp
(
Item nchar(5),
Choice nchar(5),
ChoiceCount float
)
-- Query the results table and tally by response
而 (@i
开始
SET @examcolinc = cast(@i as varchar(2)) -- 基于循环递增
SET @examcol = @res2+@examcolinc -- 追加增量以创建增量列名 - 基值是单词“item”
Declare @xsql nvarchar(1000) --this query cycles through each unique column in the results table, counting and grouping according to each response
Set @xsql = 'Select '+@examcol+' AS Choice, Count(*) AS ChoiceCount FROM dbo.'+@pretest+' WHERE '+@examcol+' <> '''' AND StudentID LIKE '''+@st+''' Group By '+@examcol
-- 执行 (@xsql)
--将原始计数存储到临时表中
插入 #rawtemp 执行 (@xsql)
插入 #temp -- 说明递增的列名称(例如,Item1、Item 2 等)
(
项目
)
价值观
(
@examcol
)
SET @i = @i+1 --increment the loop by one
end <br>
这是查询的结果:
选择 ChoiceCount
IC1 323
IC2 154
IC3 34
IC4 20
IC1 275
IC2 244
IC1 423
IC2 62
IC3 10
IC4 7
...
这是#temp 插入的结果:
项目选择 ChoiceCount
Item1 NULL NULL
项目 2 NULL NULL
Item3 NULL NULL
Item4 NULL NULL
Item5 NULL NULL
Item6 NULL NULL
Item7 NULL NULL
Item8 NULL NULL
只是想让他们结婚......因为它是我需要作为值插入到临时表中的列的“名称”,所以我一直在绞尽脑汁想弄清楚。非常感激任何的帮助。可能是上面的临时表输入到另一个临时表中,该表最终将与考试源表连接,以便我可以检索题干、干扰项、单元编号和相关的基准/标准。
【问题讨论】:
-
结果表很难使用。给定记录的“Item3”字段的值可能与另一条记录完全不同,因为它可能是完全不同的考试。我认为您需要将结果表与描述所参加考试的“resultsId”、参加考试的学生及其 lastItem 的“studentId”一起保留,并将剩余数据拆分为(例如)包含 resultsId 的“answers”表, questionId 和 answerValue。这将消除您尝试创建的报表的交叉表性质,并让您使用更有效的连接来构建它。
-
这是我最初的模式意图,但是,客户要求最终要求每项考试都有自己的结果表,这正是因为每个考试项目因考试而异。每个项目都与特定的单元和基准相关联,每个参加项目 3 的学生都会得到相同的问题。更新后,会创建一个新的考试版本(来源和结果)......对于这些考试,总是将苹果与苹果进行比较很重要。我很欣赏这个建议,但只需要根据我所拥有的解决方案......
-
呃...我很遗憾听到这个消息,而 IMO 太疯狂了。它消除了关系数据库的易用性和性能,并为您留下了无数的 Excel 电子表格。如果可能的话,争取改变并提供另一个报告选项来提供这些单考试表。是的,客户总是对的,除了建筑方面,这就是他们雇用你的原因。
-
在运行报告之前构建一个临时表并使用标准化数据填充它。这至少允许您使用单个联接来计算有多少学生选择 answerX 作为 questionY。它可能比为您要运行的每个报告构建一个 300 万个字符的查询更有效。
-
@James - 感谢您的推荐,我一直在努力尝试通过它并同时学习 T-SQL 的细微差别。我已经构建了临时表过程,但找不到将动态列名添加为临时表中的值的方法。临时表的全部目的是显示:
标签: javascript asp-classic sql-server-2012