Tsql PIVOT中的列未按所需顺序排列

Tsql PIVOT中的列未按所需顺序排列,tsql,pivot,Tsql,Pivot,我刚开始使用SQLPivot,在列的排序方面遇到了一些问题,并且对如何纠正这些问题非常认真。我已经在这里和其他网站上筛选了几篇与PIVOT相关的文章,但没有一篇立即被认为是相关的 您会注意到,我在每个查询中都添加了硬编码的OrderBy文件,但这并没有帮助,我认为是[Description]字段让皮托对列进行排序。因此,目前列按以下顺序从左到右显示: 【收费期】【优秀】【良好】【期中编号】【满意】【不满意】【非常好】 相反,我需要以下顺序: 【收费期】【期中编号】【优秀】【非常好】【良好】【满意

我刚开始使用SQLPivot,在列的排序方面遇到了一些问题,并且对如何纠正这些问题非常认真。我已经在这里和其他网站上筛选了几篇与PIVOT相关的文章,但没有一篇立即被认为是相关的

您会注意到,我在每个查询中都添加了硬编码的OrderBy文件,但这并没有帮助,我认为是[Description]字段让皮托对列进行排序。因此,目前列按以下顺序从左到右显示:

【收费期】【优秀】【良好】【期中编号】【满意】【不满意】【非常好】

相反,我需要以下顺序:

【收费期】【期中编号】【优秀】【非常好】【良好】【满意】【不满意】

我开始认为这可能不是一个纯粹的轴心问题——无论如何我都需要一些帮助,谢谢

存储过程如下所示:

DECLARE @cols NVARCHAR(MAX)
DECLARE @query NVARCHAR(MAX)

SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT '],[' + [Description] 
FROM dbo.vQualScoringGrade 
ORDER BY '],[' + [Description] FOR XML PATH('')), 1,2,'') + ']'

SET @query = N'SELECT [Fee Period], ' + @cols + ' FROM 
(SELECT [Award Fee Period],GradeCount, Description, Value, OrderBy FROM 
dbo.vQualScoringGrade) p
PIVOT (SUM([Value]) for [Description] IN ( ' + @cols + ' )) AS pvt ORDER BY [Fee Period]'

execute(@query)
为存储过程提供数据的视图[vQualScoringGrade]如下所示:

SELECT TOP (100) PERCENT [Fee Period], GradeCount, Description, 
GradeCount AS Value, OrderBy
FROM (SELECT [Fee Period], 'No of Interim' AS Description, COUNT(VerNumber) AS GradeCount, 1 AS
OrderBy
FROM dbo.vQualScoringExcellent AS vQualScoringExcellent
GROUP BY GIIANumber, Description
UNION
SELECT [Fee Period], 'Excellent' AS Description, COUNT(Description) AS GradeCount, 2 AS OrderBy
FROM dbo.vQualScoringExcellent AS vQualScoringExcellent_1
GROUP BY VerNumber, Description
UNION
SELECT [Fee Period], 'Very Good' AS Description, COUNT(Description) AS GradeCount, 3 AS OrderBy
FROM dbo.vQualScoringVeryGood AS vQualScoringVeryGood
GROUP BY VerNumber, Description
UNION
SELECT [Fee Period], 'Good' AS Description, COUNT(Description) AS GradeCount, 4 AS OrderBy
FROM dbo.vQualScoringGood AS vQualScoringGood
GROUP BY VerNumber, Description
UNION
SELECT [Fee Period], 'Satisfactory' AS Description, COUNT(Description) AS GradeCount, 5 AS
OrderBy
FROM dbo.vQualScoringSatisfactory AS vQualScoringSatisfactory
GROUP BY VerNumber, Description
UNION
SELECT [Fee Period], 'Unsatisfactory' AS Description, COUNT(Description) AS GradeCount, 6 AS OrderBy
FROM dbo.vQualScoringUnsatisfactory AS vQualScoringUnsatisfactory
GROUP BY VerNumber, Description) AS QualScoringGrade
ORDER BY OrderBy
SELECT @cols = STUFF((SELECT '],[' + [Description] 
    FROM dbo.vQualScoringGrade 
    GROUP BY [Description] 
    ORDER BY MAX([orderby]), [Description] 
    FOR XML PATH('')), 1,2,'') + ']'

您在此处指定要按字母顺序排列列:

SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT '],[' + [Description] 
  FROM dbo.vQualScoringGrade 
  ORDER BY '],[' + [Description] FOR XML PATH('')), 1,2,'') + ']'
通过添加ORDERBY子句

如果每个描述都有一个关联的列顺序字段,则可以对其进行排序以获得明确的顺序

旁白:通常从查询返回的列的顺序并不重要。使用数据的应用程序负责格式化数据。这包括以适当的顺序显示它。

尝试如下:

SELECT TOP (100) PERCENT [Fee Period], GradeCount, Description, 
GradeCount AS Value, OrderBy
FROM (SELECT [Fee Period], 'No of Interim' AS Description, COUNT(VerNumber) AS GradeCount, 1 AS
OrderBy
FROM dbo.vQualScoringExcellent AS vQualScoringExcellent
GROUP BY GIIANumber, Description
UNION
SELECT [Fee Period], 'Excellent' AS Description, COUNT(Description) AS GradeCount, 2 AS OrderBy
FROM dbo.vQualScoringExcellent AS vQualScoringExcellent_1
GROUP BY VerNumber, Description
UNION
SELECT [Fee Period], 'Very Good' AS Description, COUNT(Description) AS GradeCount, 3 AS OrderBy
FROM dbo.vQualScoringVeryGood AS vQualScoringVeryGood
GROUP BY VerNumber, Description
UNION
SELECT [Fee Period], 'Good' AS Description, COUNT(Description) AS GradeCount, 4 AS OrderBy
FROM dbo.vQualScoringGood AS vQualScoringGood
GROUP BY VerNumber, Description
UNION
SELECT [Fee Period], 'Satisfactory' AS Description, COUNT(Description) AS GradeCount, 5 AS
OrderBy
FROM dbo.vQualScoringSatisfactory AS vQualScoringSatisfactory
GROUP BY VerNumber, Description
UNION
SELECT [Fee Period], 'Unsatisfactory' AS Description, COUNT(Description) AS GradeCount, 6 AS OrderBy
FROM dbo.vQualScoringUnsatisfactory AS vQualScoringUnsatisfactory
GROUP BY VerNumber, Description) AS QualScoringGrade
ORDER BY OrderBy
SELECT @cols = STUFF((SELECT '],[' + [Description] 
    FROM dbo.vQualScoringGrade 
    GROUP BY [Description] 
    ORDER BY MAX([orderby]), [Description] 
    FOR XML PATH('')), 1,2,'') + ']'

如果我按整个时间段取出订单。@Risho-你是说你试过选择@cols=STUFF SELECT DISTINCT TOP 100 center'],['+[Description]FROM dbo.vQualScoringGrade FOR XML PATH,1,2,+']?你能比整个thnig中断更具体一些吗?我在将varchar值“],[”转换为数据类型int时,转换失败。如果我正确理解此PIVOT代码,这部分就是从我的数据生成列标题的部分,即[Description]。