sql - 如何计算每个账户为每个员工支付的工资百分比?
问题描述
我需要找到每个帐户支付的员工工资的百分比。
例如..我需要找到一种方法来汇总每个员工的金额,然后将每个金额除以该总数。
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
我只想为每个员工/帐户组合获得总工资的百分比。谢谢!
解决方案
据我了解,您可能正在寻找 的分析版本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
主查询的子句中完成。但是,只有当这是直接进入人类可读报告的最终输出时才应该这样做;如果这些值用于进一步处理(计算),最好保持原样。
推荐阅读
- java - Linux 更新后 Eclipse 不启动
- javascript - 使用 VBA 填充快速搜索栏
- javascript - HTML 5 音频播放器剩余时间显示延迟
- javascript - 使用 axios 和 JavaScript 在表格中上传图像并指示响应
- sql - 查找 Postgres/Sequelize 重复别名错误的来源(代码 42712)
- php - iCal 未显示组织者的会议时间段
- python - 计算numpy数组中的总和
- google-bigquery - BigQuery 无法从 DataPrep 导入数据
- python - How to read the response body on Python urllib when the status is an error like 400 which raises an exception?
- react-native - 无连接 reactotron / react-native