这个问题让我头疼,可能是因为数据库设计本身可能更好(比如有一个列用于存储对多个表的任何问题的响应,以映射同一个证书ID的多个记录)。
这就是表格的样子和我试图查询的样本记录,基本上是:
CERTIFICATIONID EMPID Q1_STATUS Q2_STATUS Q3_STATUS Q4_STATUS LAST_UPDATED
223 00001282122 1 0 1 1 2013-11-13 09:45:23.420
我想在短期内完成我的查询:
CERTIFICATIONID EMPID QUESTION ANSWER LAST_UPDATED
223 00001282122 1 1 2013-11-13 09:45:23.420
223 00001282122 2 0 2013-11-13 09:45:23.420
223 00001282122 3 1 2013-11-13 09:45:23.420
223 00001282122 4 1 2013-11-13 09:45:23.420
通过这些结果,基本上得到每个答案作为与每个认证相对的结果,我可以更容易地使查询生成报告(这将依赖于另一个表格中包含QUESTION id本身的问题提示之类的表格,如下所示:
EMPID QUESTIONPROMPT 2013-11-10 2013-11-11 2013-11-12 2013-11-13 2013-11-14 2013-11-15 2013-11-16
00001282122 "Was good morning?" NULL NULL NULL 1 NULL NULL NULL
00001282122 "Was good day?" NULL NULL NULL 0 NULL NULL NULL
00001282122 "Was good evening?" NULL NULL NULL 1 NULL NULL NULL
00001282122 "Was good night?" NULL NULL NULL 1 NULL NULL NULL
希望这能描述我所面临的困境。我开始研究Joins,Pivots等等。我只是不确定这里最好的方法是什么。我真的没有选择获取此认证表,并将其拆分为所有证书ID,另一个表格用于问题ID,另一个表格用于在两者之间建立正确的多对多关系(证书ID)用户可以在单个证书中回答多个问题,其他用户也会回答这些问题,并在其他证书ID中回答这些问题。
那么在这样的场景中我该怎么做呢,必须从数据库表中生成一个报告,该报表不像它应该的那样规范化和关系化。
(编辑)P.S- 我尝试尽可能地将数据格式化到这里,但是有一种很好的方法可以将SQL Server的结果引入Stack Overflow,其方式不会让我添加空格,直到下一次看起来一切都正常,我自己的效率和清洁度?
答案 0 :(得分:1)
试试这个以获得第一个结果......
SELECT
CERTIFICATIONID, EMPID, LAST_UPDATED,
CASE WHEN X.QUESTION = 'Q1_STATUS' THEN 1
WHEN X.QUESTION = 'Q2_STATUS' THEN 2
WHEN X.QUESTION = 'Q3_STATUS' THEN 3
WHEN X.QUESTION = 'Q4_STATUS' THEN 4
END [QUESTION],
ANSWER
FROM
( SELECT
CERTIFICATIONID, EMPID, LAST_UPDATED, QUESTION,
ANSWER
FROM
(SELECT *
FROM CERTIFICATION_TABLE) T
UNPIVOT
(ANSWER FOR QUESTION IN
(Q1_STATUS, Q2_STATUS, Q3_STATUS, Q4_STATUS)
)AS unpvt ) AS X