Sql 使用光标将数据垂直插入临时表
如上所述。我在SQL中创建了两个临时表,需要垂直插入才能完成所有列,但据我所知,您只能水平插入数据 有办法解决这个问题吗 例如:Sql 使用光标将数据垂直插入临时表,sql,stored-procedures,cursor,temp-tables,Sql,Stored Procedures,Cursor,Temp Tables,如上所述。我在SQL中创建了两个临时表,需要垂直插入才能完成所有列,但据我所知,您只能水平插入数据 有办法解决这个问题吗 例如: ForgeinKey | Q1 | Q2 | Q3 | Q4 | Q5 | 1234 | 1 | 1| 0 | 2 | 0| 1235 | 0 | 2| 1 | 2 | 0| 1236 | 2 | 2| 0 |
ForgeinKey | Q1 | Q2 | Q3 | Q4 | Q5 |
1234 | 1 | 1| 0 | 2 | 0|
1235 | 0 | 2| 1 | 2 | 0|
1236 | 2 | 2| 0 | 0 | 1|
我认为会发生这样的事情:
ForgeinKey | Q1 | Q2 | Q3 | Q4 | Q5 |
1234 | 1 |NULL | NULL | NULL| NULL|
1234 |NULL | 1 | NULL | NULL| NULL|
1234 |NULL |NULL | 0 | NULL| NULL|
1234 |NULL |NULL | NULL | 2 | NULL|
1234 |NULL |NULL | NULL | NULL| 0 | (etc)
目前,我的临时表(2)的前几个列中有所有数据,但之后我有22个列,我应该用另一个临时表(1)中的数据填充这些列
在临时表(1)中,我将所有数据水平显示:
Answers | Questions | ForeignKey
1 | Q1 | 1234
1 | Q2 | 1234
0 | Q3 | 1234
2 | Q4 | 1234
0 | Q5 | 1234
如上所示,我需要临时表(1)使用外键垂直填充临时表(2)以标识行:
ForgeinKey | Q1 | Q2 | Q3 | Q4 | Q5|
1234 | 1 | 1| 0 | 2| 0|
1235 | 0 | 2| 1 | 2| 0|
1236 | 2 | 2| 0 | 0| 1|
这是我目前在BlueFoots解决方案中使用的代码:
BEGIN
SET DATEFORMAT ymd;
--Temp Table 1 (Answers)
DECLARE @AnswersTempTable TABLE
(
tblManagerSpotCheckAnswer_ID bigint,
lManagerSpotCheck_ID bigint,
lManagersSpotCheckQuestion_ID bigint,
lManagersSpotCheckAnswer int,
sDescription varchar(100)
)
INSERT INTO @AnswersTempTable
SELECT tblManagerSpotCheckAnswers.tblManagerSpotCheckAnswer_ID, tblManagerSpotCheckAnswers.lManagerSpotCheck_ID,
tblManagerSpotCheckAnswers.lManagersSpotCheckQuestion_ID, tblManagerSpotCheckAnswers.lManagersSpotCheckAnswer,
tblManagerSpotCheckQuestions.sDescription
FROM tblManagerSpotCheckAnswers INNER JOIN
tblManagerSpotChecks ON tblManagerSpotCheckAnswers.lManagerSpotCheck_ID = tblManagerSpotChecks.lManagerSpotCheck_ID INNER JOIN
tblManagerSpotCheckQuestions ON
tblManagerSpotCheckAnswers.lManagersSpotCheckQuestion_ID = tblManagerSpotCheckQuestions.lManagersSpotCheckQuestion_ID LEFT OUTER JOIN
tblCallDiary ON tblManagerSpotChecks.lCallDiary_ID = tblCallDiary.lCallDiary_ID
WHERE (tblCallDiary.lCycle_ID = @lCycle_ID) AND (tblManagerSpotChecks.lRMStaff_ID = @Staff_ID)
ORDER BY tblManagerSpotChecks.lManagerSpotCheck_ID
--SELECT * FROM @AnswersTempTable
--临时表2(结果)
结束
这样做时,我仍然会出错 您的问题并不完全清楚,但您可以应用
UNPIVOT
函数将数据从列转换为行,或应用PIVOT
函数将行转换为列
一旦数据达到您需要的格式,您可以根据需要插入数据
枢轴:
select ForeignKey, Q1, Q2, Q3, Q4, Q5
from
(
select ForeignKey, questions, answers
from table1
) src
pivot
(
max(answers)
for questions in (Q1, Q2, Q3, Q4, Q5)
) piv;
select ForgeinKey, questions, answers
from table2
unpivot
(
answers
for questions in (Q1, Q2, Q3, Q4, Q5)
) unpiv
UNPIVOT:
select ForeignKey, Q1, Q2, Q3, Q4, Q5
from
(
select ForeignKey, questions, answers
from table1
) src
pivot
(
max(answers)
for questions in (Q1, Q2, Q3, Q4, Q5)
) piv;
select ForgeinKey, questions, answers
from table2
unpivot
(
answers
for questions in (Q1, Q2, Q3, Q4, Q5)
) unpiv
请参见这两个版本的说明什么是垂直插入?你能发布之前和之后的数据示例吗?你好,我现在就更新。更新。希望你明白我的意思。嗨,蓝脚怪,谢谢你的回复。我试过了,但还是有错误。“将数据类型nvarchar转换为bigint时出错”,其中很多。我已经用我用来帮助澄清我想做什么的代码更新了我原来的帖子。希望这有帮助?@user2145342您能用您的表结构和一些示例数据编辑吗?我已经试过了,但没有正确的方法。我可以将表1和表2中的值通过邮件发送给您吗?--从AnswersTempTable中选择*,从ResultTempTable中选择*?