在 SQL 服务器中将行更改为列
Change Rows to Columns in SQL Server
我已经处理这个查询一个半小时了,但我无法完成它,
首先,这是我的查询:
SELECT
Questions, PossibleAnswer,
((COUNT(PossibleAnswer) + 0.0) / 10 ) * 100 AS Percentage
FROM
(SELECT
A.AnswerID, B.Questions, B.QuestionID, C.PossibleAnswer
FROM
TblSurveyCustomerAnswers A
INNER JOIN
TblSurveyQuestion B ON A.QuestionID = B.QuestionID
INNER JOIN
TblSurveyAnswer C ON A.AnswerID = C.AnswerID
WHERE
A.CustomerID = 1) AS SOURCE
GROUP BY
Questions, PossibleAnswer
结果如下:
现在,我希望将列名称 PossibleAnswer
的行转换为列,所以我进行了研究并找到了 PIVOT
命令(我需要动态,因为它是一个可能的答案字段)这是我的代码
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(PossibleAnswer)
FROM
(
SELECT DISTINCT X.*
FROM
(
SELECT Questions,PossibleAnswer, ((COUNT(PossibleAnswer) + 0.0) / 10 ) * 100 AS Percentage
FROM
(
SELECT A.AnswerID,B.Questions, B.QuestionID, C.PossibleAnswer
FROM TblSurveyCustomerAnswers A
INNER JOIN TblSurveyQuestion B
ON A.QuestionID = B.QuestionID
INNER JOIN TblSurveyAnswer C
ON A.AnswerID = C.AnswerID
WHERE A.CustomerID = 1
) AS SOURCE
GROUP BY Questions, PossibleAnswer
) X
) AS B
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
'SELECT Questions, ' + @ColumnName + '
FROM TblSurveyCustomerAnswers A
INNER JOIN TblSurveyQuestion B
ON A.QuestionID = B.QuestionID
PIVOT(Max(Questions)
FOR PossibleAnswer IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
我无法完成枢轴工作,需要帮助。我卡住了。看到这个错误:
一般来说,对于此类问题,您应该提供样本数据、table 定义和预期输出,以便人们可以使用您的脚本,fiddle 并生成有效的内容。请参阅 How to post a T-SQL question on a public forum 了解执行此操作的一种方法。
由于很难查看动态脚本,没有 table 结构,并指出您的问题所在,让我给您以下建议:
- 与其使用生成输出的大查询并围绕该大查询形成查询,不如先将该查询的输出插入临时 table。您可以通过在
SELECT
子句之后放置一个 INTO #temp_table
子句来实现。这将创建一个包含查询输出的新临时 table #temp_table
。
SELECT --your select columns
INTO #p_in -- creates a temporary table #p_in that contains the output
FROM --the rest of your query
根据新创建的临时文件确定数据透视列table。这样会更简洁,更容易发现错误
使用临时 table 编写您的动态 SQL(同样,它会更加简洁并且更容易发现错误)
不要忘记在执行动态SQL后DROP
临时table。
我只是尝试在没有临时 table 的情况下解决问题。您可以根据需要编辑查询。
--For PIVOT column
DECLARE @ColumnName AS NVARCHAR(MAX)
SELECT @ColumnName ''''+ PossibleAnswer + '''' + ' , ' + @ColumnName
FROM
(
SELECT
DISTINCT PossibleAnswer
FROM
(
SELECT
A.AnswerID, B.Questions, B.QuestionID, C.PossibleAnswer
FROM
TblSurveyCustomerAnswers A
INNER JOIN
TblSurveyQuestion B ON A.QuestionID = B.QuestionID
INNER JOIN
TblSurveyAnswer C ON A.AnswerID = C.AnswerID
WHERE
A.CustomerID = 1
) AS SOURCE
)B
--删除最后一个逗号
IF @ColumnName != ''
BEGIN
SET @ColumnName = SUBSTRING(@ColumnName, 1, LEN(@ColumnName)-1)
END
-- 生成结果
SELECT *
FROM
(
SELECT Questions,PossibleAnswer, ((COUNT(PossibleAnswer) + 0.0) / 10 ) * 100 AS Percentage
FROM
(
SELECT A.AnswerID,B.Questions, B.QuestionID, C.PossibleAnswer
FROM TblSurveyCustomerAnswers A
INNER JOIN TblSurveyQuestion B
ON A.QuestionID = B.QuestionID
INNER JOIN TblSurveyAnswer C
ON A.AnswerID = C.AnswerID
WHERE A.CustomerID = 1
) AS SOURCE
GROUP BY Questions, PossibleAnswer
)C
PIVOT
( Max(Questions)
FOR PossibleAnswer IN (@ColumnName)
) AS PVTTable
我已经处理这个查询一个半小时了,但我无法完成它,
首先,这是我的查询:
SELECT
Questions, PossibleAnswer,
((COUNT(PossibleAnswer) + 0.0) / 10 ) * 100 AS Percentage
FROM
(SELECT
A.AnswerID, B.Questions, B.QuestionID, C.PossibleAnswer
FROM
TblSurveyCustomerAnswers A
INNER JOIN
TblSurveyQuestion B ON A.QuestionID = B.QuestionID
INNER JOIN
TblSurveyAnswer C ON A.AnswerID = C.AnswerID
WHERE
A.CustomerID = 1) AS SOURCE
GROUP BY
Questions, PossibleAnswer
结果如下:
现在,我希望将列名称 PossibleAnswer
的行转换为列,所以我进行了研究并找到了 PIVOT
命令(我需要动态,因为它是一个可能的答案字段)这是我的代码
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(PossibleAnswer)
FROM
(
SELECT DISTINCT X.*
FROM
(
SELECT Questions,PossibleAnswer, ((COUNT(PossibleAnswer) + 0.0) / 10 ) * 100 AS Percentage
FROM
(
SELECT A.AnswerID,B.Questions, B.QuestionID, C.PossibleAnswer
FROM TblSurveyCustomerAnswers A
INNER JOIN TblSurveyQuestion B
ON A.QuestionID = B.QuestionID
INNER JOIN TblSurveyAnswer C
ON A.AnswerID = C.AnswerID
WHERE A.CustomerID = 1
) AS SOURCE
GROUP BY Questions, PossibleAnswer
) X
) AS B
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
'SELECT Questions, ' + @ColumnName + '
FROM TblSurveyCustomerAnswers A
INNER JOIN TblSurveyQuestion B
ON A.QuestionID = B.QuestionID
PIVOT(Max(Questions)
FOR PossibleAnswer IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
我无法完成枢轴工作,需要帮助。我卡住了。看到这个错误:
一般来说,对于此类问题,您应该提供样本数据、table 定义和预期输出,以便人们可以使用您的脚本,fiddle 并生成有效的内容。请参阅 How to post a T-SQL question on a public forum 了解执行此操作的一种方法。
由于很难查看动态脚本,没有 table 结构,并指出您的问题所在,让我给您以下建议:
- 与其使用生成输出的大查询并围绕该大查询形成查询,不如先将该查询的输出插入临时 table。您可以通过在
SELECT
子句之后放置一个INTO #temp_table
子句来实现。这将创建一个包含查询输出的新临时 table#temp_table
。
SELECT --your select columns
INTO #p_in -- creates a temporary table #p_in that contains the output
FROM --the rest of your query
根据新创建的临时文件确定数据透视列table。这样会更简洁,更容易发现错误
使用临时 table 编写您的动态 SQL(同样,它会更加简洁并且更容易发现错误)
不要忘记在执行动态SQL后
DROP
临时table。
我只是尝试在没有临时 table 的情况下解决问题。您可以根据需要编辑查询。
--For PIVOT column
DECLARE @ColumnName AS NVARCHAR(MAX)
SELECT @ColumnName ''''+ PossibleAnswer + '''' + ' , ' + @ColumnName
FROM
(
SELECT
DISTINCT PossibleAnswer
FROM
(
SELECT
A.AnswerID, B.Questions, B.QuestionID, C.PossibleAnswer
FROM
TblSurveyCustomerAnswers A
INNER JOIN
TblSurveyQuestion B ON A.QuestionID = B.QuestionID
INNER JOIN
TblSurveyAnswer C ON A.AnswerID = C.AnswerID
WHERE
A.CustomerID = 1
) AS SOURCE
)B
--删除最后一个逗号
IF @ColumnName != ''
BEGIN
SET @ColumnName = SUBSTRING(@ColumnName, 1, LEN(@ColumnName)-1)
END
-- 生成结果
SELECT *
FROM
(
SELECT Questions,PossibleAnswer, ((COUNT(PossibleAnswer) + 0.0) / 10 ) * 100 AS Percentage
FROM
(
SELECT A.AnswerID,B.Questions, B.QuestionID, C.PossibleAnswer
FROM TblSurveyCustomerAnswers A
INNER JOIN TblSurveyQuestion B
ON A.QuestionID = B.QuestionID
INNER JOIN TblSurveyAnswer C
ON A.AnswerID = C.AnswerID
WHERE A.CustomerID = 1
) AS SOURCE
GROUP BY Questions, PossibleAnswer
)C
PIVOT
( Max(Questions)
FOR PossibleAnswer IN (@ColumnName)
) AS PVTTable