2013-04-29 56 views
0

我有一個存儲過程,其中數據字段變爲列的數據透視表。目前返回的數據有一些冗餘,並希望看看是否有方法來糾正這種情況。存儲過程實際上是餵養.rdlc報告和電流輸出看起來是這樣的:存儲過程冗餘數據和排序挑戰

Period | No Of Interim | Excellent | Very Good | Good | Satisfactory | Unsatisfactory 
------------------------------------------------------------------------------------- 
1             1 
12           1 
18     1 
18        1 
18                 1 
19                     1 
19             1 
2     1 
2        1 

這是它需要看起來像:

Period | No Of Interim | Excellent | Very Good | Good | Satisfactory | Unsatisfactory 
------------------------------------------------------------------------------------- 
1             1 
2     1   1 
12           1 
18     1   1         1 
19             1        1 

週期列需要按升序方式和重複實例排序需要添加到同一行。

的存儲過程,並負責輸出相應的視圖如下:

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

SET NOCOUNT ON; 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

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

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

execute(@query) 
end 

SELECT TOP (100) PERCENT Period, Description, GradeCount AS Value, OrderBy 
FROM (SELECT CASE CHARINDEX('.', Number) WHEN 0 THEN Number ELSE 
    REPLACE(LEFT(Number, CHARINDEX('.', Number)), '.', '') 
    END AS Period, 'NoOfInterim' AS Description, COUNT(Number) AS 
     GradeCount, 1 AS OrderBy 
FROM vQualScoringExcellent AS vQualScoringExcellent 
    GROUP BY Number, Description 
UNION 
SELECT CASE CHARINDEX('.', Number) WHEN 0 THEN Number ELSE 
    REPLACE(LEFT(Number, CHARINDEX('.', Number)), '.', '') 
    END AS Period, 'Excellent' AS Description, COUNT(Description) AS 
     GradeCount, 2 AS OrderBy 
FROM vQualScoringExcellent AS vQualScoringExcellent_1 
    GROUP BY Number, Description 
UNION 
SELECT CASE CHARINDEX('.', Number) WHEN 0 THEN Number ELSE 
    REPLACE(LEFT(Number, CHARINDEX('.', Number)), '.', '') 
    END AS Period, 'VeryGood' AS Description, COUNT(Description) AS 
     GradeCount, 3 AS OrderBy 
FROM vQualScoringVeryGood AS vQualScoringVeryGood 
    GROUP BY Number, Description 
UNION 
SELECT CASE CHARINDEX('.', Number) WHEN 0 THEN Number ELSE 
     REPLACE(LEFT(Number, CHARINDEX('.', Number)), '.', '') 
     END AS Period, 'Good' AS Description, COUNT(Description) AS 
     GradeCount, 4 AS OrderBy 
FROM vQualScoringGood AS vQualScoringGood 
     GROUP BY Number, Description 
UNION 
SELECT CASE CHARINDEX('.', Number) WHEN 0 THEN Number ELSE 
    REPLACE(LEFT(Number, CHARINDEX('.', Number)), '.', '') 
    END AS Period, 'Satisfactory' AS Description, COUNT(Description) AS 
     GradeCount, 5 AS OrderBy 
FROM vQualScoringSatisfactory AS vQualScoringSatisfactory 
    GROUP BY Number, Description 
UNION 
SELECT CASE CHARINDEX('.', Number) WHEN 0 THEN Number ELSE 
    REPLACE(LEFT(Number, CHARINDEX('.', Number)), '.', '') 
    END AS Period, 'Unsatisfactory' AS Description, COUNT(Description) AS 
     GradeCount, 6 AS OrderBy 
FROM vQualScoringUnsatisfactory AS vQualScoringUnsatisfactory 
    GROUP BY Number, Description) AS QualScoringGrade 
ORDER BY OrderBy 

回答

1

我猜測,這個問題是由於你的PIVOT查詢OrderBy列。這條線路是你的問題的原因:

SELECT Period, Description, Value, OrderBy 

我會改變查詢是:

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

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

execute(@query); 

OrderBy列未在外部選擇或PIVOT使用,但您將其包括在子查詢。此列正用於PIVOT期間發生的分組中。如果值是不同的,那麼你會得到多行。

您可以通過在最終選擇列表中包含OrderBy來輕鬆測試此功能。

+0

由於缺乏命名約定,'OrderBy'實際上是一個數據字段而不是'SQL'命令。 – Risho 2013-04-29 22:04:55

+0

@Risho對,我發現'OrderBy'是你視圖中的一列。我會使用'SortOrder'而不是混淆。但是,如果該列具有不同的值,那麼您將獲得多行。 – Taryn 2013-04-29 22:07:07

+0

你peple是天才!這工作!非常感謝! – Risho 2013-04-29 22:09:50