2009-06-05 62 views
0

我有一個同事正在使用「金額」列的表。 他們想要在同一個查詢中獲得前5個金額和金額總和。簡單的SQL選擇總計和同一列的值

我知道你可以這樣做:

SELECT TOP 5 amount FROM table 
UNION SELECT SUM(amount) FROM table 
ORDER BY amount DESC 

但是,這產生的結果是這樣的:

1000 (sum) 
100 
    70 
    50 
    30 
    20 

當他們真正需要的是這樣的:

100 | 1000 
70 | 1000 
50 | 1000 
30 | 1000 
20 | 1000 

我直觀的嘗試要實現這一點往往會遇到分組問題,當您選擇不同的列時,這不是一個問題,但是當您想要使用基於您所選列的聚合函數時。

回答

6

可以使用CROSS JOIN此:

SELECT TOP 5 a.amount, b.sum 
FROM table a 
CROSS JOIN (SELECT SUM(amount) sum FROM table) b 
ORDER BY amount DESC 
+0

謝謝你的工作。我沒有想到使用連接表來完成總和,我仍然嘗試SUM(b.amount)而不是b.sum。 – 2009-06-05 06:02:01

2

這可能會實現

SELECT TOP 5 amount, (SELECT SUM(amount) FROM table) 
FROM table 
ORDER BY amount DESC 
+0

完美的感謝(以及刪除該組) - 我曾試圖SUM(選擇)不選擇(總和),所以我很接近,但你固定它的感謝:-) – 2009-06-05 06:00:23

+0

不知道爲什麼我通過:)添加組肯定是睡眠。 – 2009-06-05 06:01:43

1

不是很漂亮,但是這shouls做到這一點:

SELECT TOP 5 amount, SAmount 
FROM table Join 
    (SELECT SUM(amount) As SAmount FROM table) 
ORDER BY amount DESC 

如說其他人,我可能會使用兩個查詢。

1

使用另一種方法解析函數(SQL Server 2005+):

SELECT TOP 5 amount, SUM(amount) OVER() 
FROM table 
ORDER BY 
     amount DESC