首页 > 解决方案 > 如何计算每个账户为每个员工支付的工资百分比?

问题描述

我需要找到每个帐户支付的员工工资的百分比。

例如..我需要找到一种方法来汇总每个员工的金额,然后将每个金额除以该总数。

employee 1  
acct 111   
$1000

employee 1  
acct 112   
$2000

employee 2  
acct 111   
$1000

employee 2  
acct 112   
$2000

employee 2  
acct 113   
$3000

我已经阅读了关于 sql 中报告函数的比率,但它并没有解决我的问题,因为它将每个员工的工资相加,然后根据该总数给出一个百分比。

我还尝试做一个单独的子查询,在其中做简单的数学运算 (x/(x+y)*100) 但我不想按数量分组,因为这会显着增加行输出。

SELECT DISTINCT a.EMPLID, a.fund_grp_cd, a.position_nbr, a.account_nbr, 
a.account_nm, a.sub_acct_nbr, a.sub_acct_nm, a.org_cd, a.org_nm, 
a.fin_hgh_ed_func_cd, a.fin_object_cd, SUM(a.total)
FROM
(SELECT ld.emplid, sf.fund_grp_cd, ld.position_nbr, cat.org_cd, o.org_nm, 
cat.fin_hgh_ed_func_cd, ld.account_nbr, cat.account_nm, 
ld.sub_acct_nbr, s.sub_acct_nm, ld.fin_object_cd, 
CASE WHEN ld.TRN_DEBIT_CRDT_CD = 'C' THEN ld.TRN_LDGR_ENTR_AMT * -1 ELSE 
ld.TRN_LDGR_ENTR_AMT END AS TOTAL 
FROM LD_LDGR_ENTR_T ld
INNER JOIN CA_ACCOUNT_T cat
ON ld.account_nbr = cat.account_nbr
and ld.fin_coa_cd = cat.fin_coa_cd
LEFT JOIN CA_SUB_ACCT_T s
ON s.account_nbr = ld.account_nbr
and s.sub_acct_nbr = ld.sub_acct_nbr
LEFT JOIN CA_ORG_T o
ON o.org_cd = cat.org_cd
LEFT JOIN CA_SUB_FUND_GRP_T sf
ON sf.SUB_FUND_GRP_CD = cat.SUB_FUND_GRP_CD
LEFT JOIN CA_OBJECT_CODE_T o
ON o.fin_object_cd = ld.fin_object_cd
AND o.univ_fiscal_yr = ld.univ_fiscal_yr
WHERE ld.univ_fiscal_yr = '2019'
and cat.org_cd IN
 ('1901','1902','1903','1904','1905','1906','1907','1908','PHRM','RX09',
'RXEE' 
,'RXO1','RXO2','RXO3','RXO4','RXO5','RXO6','RXO7','RXO8','RXPX',
'RXR1','RXR2','RXR3','RXR4','RXR5','RXR6','RXR7','RXR8')
AND ld.univ_fiscal_prd_cd IN 
('01','02','03','04','05','06','07','08','09','10','11','12')
AND o.rpts_to_fin_obj_cd = '1100'
AND cat.acct_closed_ind = 'N'
)a
GROUP BY a.EMPLID, a.account_nbr, a.fin_object_cd, a.account_nm, 
a.sub_aenter code here`cct_nbr, a.sub_acct_nm, 
a.position_nbr, a.org_cd, a.org_nm, a.fin_hgh_ed_func_cd, a.fund_grp_cd
HAVING SUM(a.total) <> 0

我只想为每个员工/帐户组合获得总工资的百分比。谢谢!

标签: sqloracle

解决方案


据我了解,您可能正在寻找 的分析版本ratio_to_report(),否则,这确实是正确的解决方案。像这样的东西(请注意,我将测试数据包含在顶部的 WITH 子句中;这不是查询的一部分,当您将解决方案应用于实际数据时应该将其删除)。

with
  test_data (employee, acct, amount) as (
    select 1, 111, 1000 from dual union all
    select 1, 112, 2000 from dual union all
    select 2, 111, 1000 from dual union all
    select 2, 112, 2000 from dual union all
    select 2, 113, 3000 from dual
  )
select employee, acct, amount,
       ratio_to_report(amount) over (partition by employee) as pct_of_pay
from   test_data
;

  EMPLOYEE       ACCT     AMOUNT PCT_OF_PAY
---------- ---------- ---------- ----------
         1        112       2000 .666666667
         1        111       1000 .333333333
         2        112       2000 .333333333
         2        113       3000         .5
         2        111       1000 .166666667

(如您所见,我没有订购输出;如果需要,您可以订购。)

注意分析子句, over (partition by employee); 我相信那是你缺少的部分。

我不知道这如何与您的其余代码相匹配,您在其中做了很多看起来与您提出的问题无关的事情。

另外,我希望您的金额是数字,而不是字符串。(不确定每个金额前面的美元符号......)

您没有说明您希望如何格式化百分比。如果没有任何格式,您将获得类似 0.3333333333 的 33 1/3 %(三分之一)。您可能需要乘以 100,将小数点去掉两位或三位,添加百分号等 - 所有这些都可以在SELECT主查询的子句中完成。但是,只有当这是直接进入人类可读报告的最终输出时才应该这样做;如果这些值用于进一步处理(计算),最好保持原样。


推荐阅读