2013-04-17 78 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