2016-02-29 59 views
4

單個查詢降序我有如下所示的數據:升序&與骨料&分區

name SAL1 SAL2 SAL3 
A  10 20 30 
B  11 21 31 
C  12 22 32 
D  13 23 33 

我試圖獲得額外的計算列,即25分之10* 100
[SAL1的A /總和(TOP 2 SAL1 ORDER BY SAL1 DESC) 而是考慮所有分母,我需要通過SAL遞減分別

只考慮前2 SAL爲了使行的其餘部分記錄總和。 隨後與其他列。通過升序對名稱列和desc

name SAL_calculated 
A 40 
B 44 
C 48 
D 52 

而做爲了使列

+0

什麼是您使用的是SQL Server的版本? – Squirrel

+0

這是SQL Server 2012中 – MAX

+0

相反的考慮和對所有分母,我需要通過SAL遞減只考慮前2 SAL爲了 即10月25日* 100未46分之10* 100遺憾的變化記錄 即A = 40而不是21.7 – MAX

回答

5
SELECT name, SAL_calculated = SAL * 100.0/SUM(SAL) OVER() 
FROM table 
ORDER BY name ASC, SAL_calculated DESC 

爲A /薩姆的SAL1的其餘部分(TOP 2 SAL1 ORDER BY SAL1 DESC)

select *, t.SAL1 * 100.0/c.TOP2_SAL 
from tbl t 
    CROSS APPLY 
    (
     SELECT TOP2_SAL = SUM(SAL1) 
     FROM 
     (
      SELECT TOP 2 SAL1 
      FROM tbl 
      ORDER BY SAL1 desc 
     ) c 
    ) c 
+4

'SELECT name,SAL_calculated = 100.0 * SAL/SUM(SAL)OVER()'請記住SQL Server **整數除法**! ** [演示](https://data.stackexchange.com/stackoverflow/query/443360)**否則您將獲得零。 – lad2025

+0

好點..... – Squirrel

+0

用戶是否需要按列計算的總和 – TheGameiswar

0

試試這個:

SELECT name, SAL1, SAL2, SAL3, 
     ROUND(SAL1 * 1.0/x.v * 100, 1) AS SAL_calculated 
FROM mytable 
CROSS JOIN (SELECT SUM(SAL1) FROM mytable) AS x(v) 
ORDER BY name, SAL1 DESC, SAL2 DESC, SAL3 DESC 
0

那麼這裏是我做的,

在子查詢中,我們可以存儲前N個或整套的信息彙集到變量一個,然後使用該變量作爲分母。

申報@a爲整數= 0 SELECT @a = ( SELECT TOP2_SAL = SUM(SAL1) FROM ( SELECT TOP 2 SAL1 FROM [DBO]。[暴躁] ORDER BY SAL1降序 )C ) 選擇 *, t.SAL1 * 100/@a 從[DBO]。[暴躁] T,