2016-12-27 111 views
1

后,我想用逗号和RATIO_PERCENT等于1SQL服务器比SQL请求逗号

的总和经过2十进制结果这是我的要求:

SELECT T1.Matricule 
, T1.mois 
, T1.Contract 
, T1.WorkPackage,SpentTime 
, SUM(sum(T1.SpentTime)) OVER() as total 
, 100.0 * SUM(T1.SpentTime)/SUM(sum(T1.SpentTime)) OVER() AS RATIO_POURCENT 
FROM Temp_ODdePaieWithoutGenius T1 
GROUP BY T1.Matricule, T1.mois, T1.Contract, T1.WorkPackage,SpentTime 
; 

而且我的结果:

1 2015-01-01 test WP1.2 1 178 0,561797752808989 
1 2015-01-01 test1 WP1.3 30 178 16,8539325842697 
1 2015-01-01 test1 WP1.4 2 178 1,12359550561798 
1 2015-01-01 test1 WP1.5 2 178 1,12359550561798 
1 2015-01-01 test1 WP1.6 2 178 1,12359550561798 
1 2015-01-01 test1 WP3.1 10 178 5,61797752808989 
1 2015-01-01 test1 WP4.1 20 178 11,2359550561798 
1 2015-01-01 test1 WP5.1 52 178 29,2134831460674 
1 2015-01-01 test2 WP2.1 2 178 1,12359550561798 
1 2015-01-01 test2 WP2.2 6 178 3,37078651685393 
1 2015-01-01 test2 WP2.3 8 178 4,49438202247191 
1 2015-01-01 test2 WP2.4 2 178 1,12359550561798 
1 2015-01-01 test2 WP2.5 4 178 2,24719101123596 
1 2015-01-01 test2 WP2.6 9 178 5,0561797752809 
1 2015-01-01 test2 WP2.7 3 178 1,68539325842697 
1 2015-01-01 test2 WP2.8 6 178 3,37078651685393 
1 2015-01-01 test2 WP3.1 2 178 1,12359550561798 
1 2015-01-01 test2 WP6.1 5 178 2,80898876404494 
1 2015-01-01 test3 WP1.1 10 178 5,61797752808989 
1 2015-01-01 test3 WP2.9 2 178 1,12359550561798 

随着简单地ROUND(),总和不等于1

ROUND(100.0 * SUM(T1.SpentTime)/ SUM(sum(T1.SpentTime))OVER())

您能帮助我吗? Thx!

+1

这是一个相当困难的问题。只需输入一个免责声明,由于四舍五入,数字可能不会增加到100%。 –

+1

您可以实现累计百分比。看看这个[回答](http://stackoverflow.com/a/13483486/4357941) –

+1

所以,如果你有三行33.333333%你会发生什么?其中一人随意被给予比其他人更高的人数? –

回答

1

未测试,但在这里我们将手术调整为最大值。

我们只是嵌套原始查询(与ROUND()),然后进行最后的调整

Select Matricule 
    , mois 
    , Contract 
    , WorkPackage 
    , SpentTime 
    , total 
    , RATIO_POURCENT = RATIO_POURCENT + case when Row_Number() over (Order By RATIO_POURCENT Desc) = 1 then 100-sum(RATIO_POURCENT) over() else 0 end 
From (
     SELECT T1.Matricule 
     , T1.mois 
     , T1.Contract 
     , T1.WorkPackage,SpentTime 
     , SUM(sum(T1.SpentTime)) OVER() as total 
     , ROUND(100.0 * SUM(T1.SpentTime)/SUM(sum(T1.SpentTime)) OVER(),2) AS RATIO_POURCENT 
     FROM Temp_ODdePaieWithoutGenius T1 
     GROUP BY T1.Matricule, T1.mois, T1.Contract, T1.WorkPackage,SpentTime 
     ) A