2

それぞれの行のセットを返すストアド プロシージャがありますActivityUnitId

必要なのは、時間に基づく各 ActivityUnitId の上位 10 行です。私はこれを達成することができました、私のクエリは次のようになります

With Data AS
(SELECT  
   ProjectID,ActivityUnitID,Description,GroupID,
   SUM(Hours) AS NoiseHours,
   ROW_NUMBER() OVER(PARTITION BY ActivityUnitID ORDER BY SUM(Hours) DESC) as 'RowNum'
FROM         
   tbl_Sub 
INNER JOIN
   tbl_AnalysisData ON tbl_Sub.SubActivityID = tbl_AnalysisData.SubActivityID 
     INNER JOIN
       tbl_Analysis ON tbl_AnalysisData.LookupID = tbl_Analysis.LookupID
         INNER JOIN
           tbl_ActivityUnit ON tbl_ActivityUnit.ActivityUnitID = tbl_Sub.ActivityUnitID
           tbl_Suby.ProjectID = @ProjectID 
         AND
           tbl_Sub.ActivityUnitID = ISNULL(@ActivityUnitID,tbl_Sub.ActivityUnitID)
GROUP BY 
  ActivityUnitID,ProjectID,  Description,AUGroupID
) SELECT * from Data where RowNum<=10

「RowNum」列には、各行の行番号が含まれており、その値は時間に基づいて割り当てられています。したがって、最初の 10 行には上位 10 時間の行が含まれます。

今私が欲しいのは、各 ActivityUnitID の最後に追加の要約行を追加することです。これには、除外されたすべての行の時間の合計が含まれます。つまり、RowNum > 10 の要約行です。

最終的に得られるのは、各 ActivityUnitID の上位 10 行と、その ActivityUnitID の他の行の時間を合計する追加の行です。

たとえば、2列のテーブルがあるとしましょう

ID  Hours     RowNum
1A    30         1
2B    20         2
3C    10         3
4D     5         4
5E     4         5
6F     3         6

これを選択して、RowNum <=3 の行と、他の行を合計した別の行を取得するにはどうすればよいですか

ID  Hours  
1A   30
2B   20
3C   10
Oth  12
4

1 に答える 1

3

最も簡単な方法はUNION、すでに持っているデータを合計することです

SELECT  NULL, NULL, 'Totals', NULL, SUM(NoiseHours), 11 AS RowNumber
FROM    Data 
WHERE   RowNum > 10

あなたの完全なステートメントは、次のようになります

With Data AS
(
SELECT  ProjectID,ActivityUnitID,Description,GroupID,
        SUM(Hours) AS NoiseHours,
        ROW_NUMBER() OVER(PARTITION BY ActivityUnitID ORDER BY SUM(Hours) DESC) as 'RowNum'
FROM         tbl_Sub 
            INNER JOIN
            tbl_AnalysisData ON tbl_Sub.SubActivityID = tbl_AnalysisData.SubActivityID 
            INNER JOIN
            tbl_Analysis ON tbl_AnalysisData.LookupID = tbl_Analysis.LookupID
            INNER JOIN
            tbl_ActivityUnit ON tbl_ActivityUnit.ActivityUnitID = tbl_Sub.ActivityUnitID
tbl_Suby.ProjectID = @ProjectID 
AND
tbl_Sub.ActivityUnitID = ISNULL(@ActivityUnitID,tbl_Sub.ActivityUnitID)
GROUP BY ActivityUnitID,ProjectID,  Description,AUGroupID
)
SELECT * from Data where RowNum<=10
UNION ALL 
SELECT  NULL, NULL, 'Totals', NULL, SUM(NoiseHours), 11 AS RowNumber
FROM    Data 
WHERE   RowNum > 10

ユニオンを使用する際の難点は、ユニオンの両方の部分に同じ数と同じタイプの列が必要であるため、選択にダミー列を追加する必要があることです。

于 2012-10-29T05:41:30.560 に答える