2013-04-29 66 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