【问题标题】:SQL Server 2012 Relating table row value to column name in results tableSQL Server 2012 将表行值与结果表中的列名相关联
【发布时间】: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


【解决方案1】:

像这样构建你的临时表:

ExamId (exam source table name, eg 'FOT2012PRE') 
ItemNum (from exam source table, eg 'Item1') 
StudentId (eg 'MD911059935') 
Response (eg 'IC1', or NULL)
  • 如果多个学校使用完全相同的“examId”,请添加列以区分学校

这将为每个唯一的考试/问题编号/回答的学生提供一行,以及他的回答(如果有)。

要填充此表,请遍历检查源表;每行的 ItemNum 字段包含结果表中的列名之一。从结果表中取出studentId +对应结果列的值(如Item2,包含“IC4”),存入临时表中。

在您当前使用的构建查询中,您能不能:

Set @xsql = 'Select ''' + @examcol + ''' as Item, '+@examcol+' AS Choice, Count(*) AS ChoiceCount FROM dbo.'+@pretest+' WHERE '+@examcol+' <> '''' AND StudentID LIKE '''+@st+''' Group By '+@examcol

【讨论】:

  • 考试源表和结果表不同,我尝试使用参数/变量作为列名创建表......它不喜欢它。我已经更新了这个问题,向您展示我目前拥有的内容。任何帮助都会很棒!
  • 我实际上早先尝试过,但它给了我一个错误,即“项目”列不是聚合函数的一部分。您所做的是使用递增的列名称作为别名为“Item”的文本元素。我非常感谢你......我的键盘感谢你,因为我现在会更轻柔地打字并停止敲打我的头。你已经消除了我项目中的瓶颈!!!
猜你喜欢
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多