【发布时间】:2015-12-14 21:14:28
【问题描述】:
我有一个表格,每 1 次调查存储 1 行。
每个调查有大约 70 个问题,每列有 1 个问题
SurveyID Q1, Q2 Q3 .....
1 Yes Good Bad ......
我想把它转过来,这样它就变成了
SurveyID Question Answer
1 Q1 Yes
1 Q2 Good
1 Q3 Bad
... ... .....
我使用 {cross apply} 来实现这一目标
SELECT t.[SurveyID]
, x.question
, x.Answer
FROM tbl t
CROSS APPLY
(
select 1 as QuestionNumber, 'Q1' as Question , t.Q1 As Answer union all
select 2 as QuestionNumber, 'Q2' as Question , t.Q2 As Answer union all
select 3 as QuestionNumber, 'Q3' as Question , t.Q3 As Answer) x
这可行,但我不想这样做 70 次,所以我有这个选择语句
select ORDINAL_POSITION
, COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = mytable
这给了我列的列表和列在表中的位置。 所以我希望我能以某种方式将第二条语句与第一条语句加入列名。但是,我在这里比较列和列标题中的内容。可行吗?还有其他方法可以实现这一目标吗?
希望你能指导我吗?
谢谢
【问题讨论】:
-
除非您使用动态 sql,否则无法加入结果集。更容易使用 select 语句来制作 70 个 select 语句,然后使用编辑器复制这些语句。这将为您节省一些打字时间。
标签: sql-server tsql pivot cross-apply