从多列上的单个数据集中选择具有组合列但多行的结果

时间:2013-11-21 18:23:05

标签: sql sql-server join report pivot

这个问题让我头疼,可能是因为数据库设计本身可能更好(比如有一个列用于存储对多个表的任何问题的响应,以映射同一个证书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,其方式不会让我添加空格,直到下一次看起来一切都正常,我自己的效率和清洁度?

1 个答案:

答案 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