2013-04-17 84 views
0

我刚开始使用SQL PIVOT,并且对列的排序有问题,并且对于如何纠正它很有帮助。我在这里和其他网站上筛选了几个与PIVOT相关的帖子,但没有直接相关的东西。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 

回答

1

试试这样说:

SELECT @cols = STUFF((SELECT '],[' + [Description] 
    FROM dbo.vQualScoringGrade 
    GROUP BY [Description] 
    ORDER BY MAX([orderby]), [Description] 
    FOR XML PATH('')), 1,2,'') + ']' 
+0

你是那个人,RBarryYoung !!!感谢您花费宝贵的时间。 – Risho

0

你指定你想在这里按字母顺序排列的列:

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

通过添加ORDER BY子句。

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

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

+0

如果我参加了'订单by'整个thnig休息。 – Risho

+1

@Risho - 你是说你试过'SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT'],['+ [Description] FROM dbo.vQualScoringGrade FOR XML PATH('')),1,2,' ')+']''?你能比整个thnig突破更具体吗? – HABO

+0

转换varchar值时转换失败]],['转换为数据类型int.'如果我正确理解这个'PIVOT'代码,这部分是从我的数据构建列标题,即[Description]。 – Risho