sum(sal)over(partition by deptno) 为开窗函数,计算每一个分组(按部门编号deptno分组)的工资总和。sal/sum(sal)over(partition by deptno)计算的是每一名员工的薪资部门占比。
正确答案是:C
专业分析如下:
A: `select *, sal/(select sum(sal) from emp) as 薪资部门占比 from emp;`
- 这条语句计算的是每个员工的薪资占全表总薪资的比例,而不是按部门计算的薪资占比。因此,这不是我们需要的结果。
B: `select *, sal/sum(sal) as 薪资部门占比 from emp;`
- 这条语句试图直接在同一行中计算sum(sal),但没有使用聚合函数或窗口函数,因此会导致SQL语法错误。
C: `select *, sal/sum(sal)over(partition by deptno) as 薪资部门占比 from emp;`
- 这条语句使用了窗口函数`sum(sal) over(partition by deptno)`,它会根据部门编号(deptno)对薪资进行分区计算,从而得到每个员工在其所在部门中的薪资占比。这正是我们需要的结果。
D: `select *, sal/sum(sal)over(partition by empid) as 薪资部门占比 from emp;`
- 这条语句使用了窗口函数`sum(sal) over(partition by empid)`,但它是按员工编号(empid)进行分区的,这意味着每个员工的分区只有自己一个人,因此计算结果总是1,不符合需求。
综上所述,正确答案是C。