2012-10-29 38 views
2

我有一個存儲過程,它爲每個ActivityUnitId返回一組行。摘要SQL中的行

需要的是基於小時數的每個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周的cols

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 
+3

不要在沒有給出解釋的情況下排除這個問題。就有關的努力而言,我已經在這個問題上討論了一段時間,但沒能找到足夠接近的解決方案。只是不想粘貼我的代碼,只是爲了顯示我的努力,當我知道這是錯誤的。 –

回答

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 

困難使用時工會認爲工會的兩個部門應該有相同數量和相同類型的專欄,因此需要添加虛擬列的選擇。

+0

非常感謝,感謝您的意見。 –

+1

@ Abhi.Net - 不客氣,附帶一個便箋,我不知道爲什麼這個問題會吸引如此多的downvotes ...最有可能的人都有星期一布魯斯;) –

+0

+1頁的所有方式。倒票是無稽之談。 –