如何将多行转换为单行

暗灯

这是一个研究数据库,具有(是的,我知道设计欠佳)一个数据库,其中包括针对参与者的问卷。在研究中三遍(P1 / P2 / P3)向参与者询问此问卷

问卷的表格结构;

问卷1。

+--+-------+--------+--+--+--+--+--+---
|PK|Part_ID|Phase_Id|Q1|q2|q3|q4|q5|...
+--+-------+--------+--+--+--+--+--+---
|1 |A010   |P1      |1 |0 |1 |0 |1 |...
+--+-------+--------+--+--+--+--+--+---
|2 |A010   |P2      |0 |1 |0 |1 |0 |...
+--+-------+--------+--+--+--+--+--+---
|3 |A010   |P3      |1 |0 |1 |0 |1 |...
+--+-------+--------+--+--+--+--+--+---

对于每个参与者,依此类推。

所有参与者最多可以包含3个阶段,也可以少于3个阶段。由于表结构,列数始终相同。

研究人员希望将所有数据放在一行上,以输入到分析程序(SPSS)中。所以输出结构应该看起来像这样

+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|Part_ID|P1_Q1|P1_q2|P1_q3|P1_q4|P1_q5|P2_Q1|P2_q2|P2_q3|P2_q4|P2_q5|P3_Q1|P3_q2|P3_q3|P3_q4|P3_q5|
+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|A010   |1    |0    |1    |0    |1    |0    |1    |0    |1    |0    |1    |0    |1    |0    |1    |
+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

使用SQL Server 2008 Express。

我看了一些枢轴和非枢轴的示例,但不认为它们是正确的方法(不需要汇总)。

因此,任何指针都将是很棒的。

问候

罗杰(我希望演示格式可以出炉)。

术语

你可以UPIVOT你的表第一,PIVOT它再次

SELECT Part_Id, 
       P1_Q1, P1_Q2, P1_Q3, P1_Q4, P1_Q5,
       P2_Q1, P2_Q2, P2_Q3, P2_Q4, P2_Q5,
       P3_Q1, P3_Q2, P3_Q3, P3_Q4, P3_Q5
  FROM
(
  SELECT Part_ID, Phase_Id + '_' + Question Question, Value
    FROM 
  ( 
    SELECT Part_ID, Phase_Id, q1, q2, q3, q4, q5
      FROM Table1
  ) s
  UNPIVOT
  ( 
    Value FOR Question IN (q1, q2, q3, q4, q5) 
  ) u
) s
PIVOT
(
  MAX(Value) FOR Question IN 
  (
    P1_Q1, P1_Q2, P1_Q3, P1_Q4, P1_Q5,
    P2_Q1, P2_Q2, P2_Q3, P2_Q4, P2_Q5,
    P3_Q1, P3_Q2, P3_Q3, P3_Q4, P3_Q5
  )
) p

或使用条件聚合

SELECT Part_Id,
       MAX(CASE WHEN Phase_id = 'P1' THEN Q1 END) P1_Q1,
       MAX(CASE WHEN Phase_id = 'P1' THEN Q2 END) P1_Q2,
       MAX(CASE WHEN Phase_id = 'P1' THEN Q3 END) P1_Q3,
       MAX(CASE WHEN Phase_id = 'P1' THEN Q4 END) P1_Q4,
       MAX(CASE WHEN Phase_id = 'P1' THEN Q5 END) P1_Q5,
       MAX(CASE WHEN Phase_id = 'P2' THEN Q1 END) P2_Q1,
       MAX(CASE WHEN Phase_id = 'P2' THEN Q2 END) P2_Q2,
       MAX(CASE WHEN Phase_id = 'P2' THEN Q3 END) P2_Q3,
       MAX(CASE WHEN Phase_id = 'P2' THEN Q4 END) P2_Q4,
       MAX(CASE WHEN Phase_id = 'P2' THEN Q5 END) P2_Q5,
       MAX(CASE WHEN Phase_id = 'P3' THEN Q1 END) P3_Q1,
       MAX(CASE WHEN Phase_id = 'P3' THEN Q2 END) P3_Q2,
       MAX(CASE WHEN Phase_id = 'P3' THEN Q3 END) P3_Q3,
       MAX(CASE WHEN Phase_id = 'P3' THEN Q4 END) P3_Q4,
       MAX(CASE WHEN Phase_id = 'P3' THEN Q5 END) P3_Q5
  FROM Table1
 GROUP BY Part_Id;

输出:

| PART_ID | P1_Q1 | P1_Q2 | P1_Q3 | P1_Q4 | P1_Q5 | P2_Q1 | P2_Q2 | P2_Q3 | P2_Q4 | P2_Q5 | P3_Q1 | P3_Q2 | P3_Q3 | P3_Q4 | P3_Q5 | 
| --------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |- ------ | ------- | ------- || ------- | 
| A010 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |

这是SQLFiddle演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章