我有一张包含员工数据的表
EmployeeNum | Department | Salary
1000 | 1 | 400
1001 | 1 | 200
1002 | 2 | 350
1003 | 2 | 450
我希望在一个选择查询中获得部门工资和每位员工的工资总和。预期的输出是
SQNO | EmployeeNum | Department | Salary
1 | 1000 | 1 | 400
2 | 1001 | 1 | 200
| | 1 | 600
3 | 1002 | 2 | 350
4 | 1003 | 2 | 450
| | 2 | 800
我的方法是
select
case
when EmployeeNum is null
then null
else ROW_NUMBER() over (order by Department)
end as SQNO,
EmployeeNum,
Department,
SUM(Salary)
from
EMPDetails
group by
GROUPING sets(EmployeeNum, Department), (Department)
此选择的输出是
SQNO | EmployeeNum | Department | Salary
1 | 1000 | 1 | 400
2 | 1001 | 1 | 200
| | 1 | 600
4 | 1002 | 2 | 350
5 | 1003 | 2 | 450
| | 2 | 800
有没有办法按我们的意愿跳过行号或其他任何想法如何做到这一点?。
答案 0 :(得分:1)
试试这个:
SELECT
emps.seqn,
emps.EmployeeNum,
CASE WHEN emps.Department IS NULL THEN outere.Department ELSE emps.Department END AS DEP,
CASE WHEN emps.salary IS NULL THEN outere.TOTALSUM ELSE emps.salary END AS salary
FROM (
SELECT *, row_number( ) over(order by Department, EmployeeNum) as seqn from EMPDetails
) emps
FULL JOIN (SELECT Department, SUM(salary) as TOTALSUM, -1 as a from EMPDetails GROUP BY Department) outere
ON emps.salary = outere.a
ORDER BY DEP, CASE WHEN EmployeeNum IS NOT NULL THEN EmployeeNum ELSE 9223372036854775807 END
答案 1 :(得分:0)
您可以使用DENSE_RANK()
和底部的其他order by
子句执行此操作:
select
case
when EmployeeNum is null
then null
else dense_rank() over (order by EmployeeNum)
end as SQNO,
EmployeeNum,
Department,
SUM(Salary)
from
EMPDetails
group by
GROUPING sets(EmployeeNum, Department), (Department)
order by department
答案 2 :(得分:0)
另一种可能返回你想要的东西
DECLARE @T AS TABLE (EmployeeNum INT, Departement INT, Salary INT)
INSERT INTO @T VALUES (1000,1,400),(1001,1,200), (1002,2,350), (1003,2,450)
SELECT a.SQNO, a.EmployeeNum, a.Departement, a.Salary
FROM (
SELECT 1 AS dummy, ROW_NUMBER() OVER(ORDER BY DEPARTEMENT) SQNO, EmployeeNum, Departement, Salary
FROM @T
UNION
SELECT 2, NULL, NULL, Departement, SUM(Salary)
FROM @T
GROUP BY Departement
) AS a
ORDER BY Departement,a.dummy
答案 3 :(得分:0)
Use CTE method to get tolal for each department :
;WITH CTE (_Id , SQNo , EmployeeNum , Departement , Salary ) AS
(
SELECT 0, ROW_NUMBER() OVER(ORDER BY DEPARTEMENT) SQNO, EmployeeNum,
Departement, Salary FROM your_table
UNION ALL
SELECT 1, NULL SQNO, NULL EmployeeNum, Departement, SUM(Salary) Salary
FROM your_table
GROUP BY Departement
)
SELECT SQNo , EmployeeNum , Departement , Salary
FROM CTE ORDER BY Departement,_Id ASC