gpt4 book ai didi

sql - 使用 T-SQL 将列动态转换为行

转载 作者:行者123 更新时间:2023-12-04 09:17:09 25 4
gpt4 key购买 nike

我有下表,我需要将列转换为行
tbl_调查:

      SurveyID   Quest_1  Quest_2  Quest_3
7 1 1 1
8 2 2 2
9 3 3 3


我需要得到以下结果:
       SurveyID  Questions  Rating 
7 Quest_1 1
7 Quest_2 1
7 Quest_3 1
8 Quest_1 2
8 Quest_2 2
8 Quest_3 2
9 Quest_1 3
9 Quest_2 3
9 Quest_3 3

为了得到这个结果,我使用了以下代码:
       SELECT [SurveyID], [Question], [Rating]
FROM [dbo].[tbl_Survey]

UNPIVOT
(
[Rating]
FOR [Question] in ([Quest_1], [Quest_2], [Quest_3])
) AS SurveyUnpivot
但是,我的 Quest_1、Quest_2、Quest_3 值可能会更改/甚至添加一个新的一次...
有没有办法对它们进行编码,以便它可以用于任何文本值(不仅用于 Quest_1 2 3)?
UNPIVOT 不需要...可以是任何其他方式
谢谢

最佳答案

你需要做一个动态UNPIVOT .检查下面的例子:

DROP TABLE IF EXISTS [dbo].[DataSource];

CREATE TABLE [dbo].[DataSource]
(
[SurveyID] INT
,[Quest_1] INT
,[Quest_2] INT
,[Quest_3] INT
);

INSERT INTO [dbo].[DataSource] ([SurveyID], [Quest_1], [Quest_2], [Quest_3])
VALUES (7, 1, 1, 1)
,(8, 2, 2, 2)
,(9, 3, 3, 3);

GO

DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
DECLARE @DynamicTSQLUnpivotColumns NVARCHAR(MAX);

SET @DynamicTSQLUnpivotColumns = STUFF
(
(
SELECT ',' + QUOTENAME([name])
FROM [sys].[columns]
WHERE [object_id] = OBJECT_ID('[dbo].[DataSource]')
AND [name] <> 'SurveyID'
ORDER BY [name]
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1
,1
,''
);

SET @DynamicTSQLStatement = N'
SELECT [SurveyID], [Question], [Rating]
FROM [dbo].[DataSource]
UNPIVOT
(
[Rating] FOR [Question] in (' + @DynamicTSQLUnpivotColumns + ')
) AS SurveyUnpivot';

EXEC sp_executesql @DynamicTSQLStatement;

关于sql - 使用 T-SQL 将列动态转换为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63166797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com