如何在select语句中生成SQL Server中的自定义序列号

时间:2017-03-15 07:25:28

标签: sql sql-server sql-server-2008

我有一张包含员工数据的表

   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

有没有办法按我们的意愿跳过行号或其他任何想法如何做到这一点?。

4 个答案:

答案 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