【问题标题】:How to generate custom sequence number in SQL Server within a select statement如何在 SQL Server 中的 select 语句中生成自定义序列号
【发布时间】:2017-03-15 07:25:27
【问题描述】:

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

   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

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

【问题讨论】:

  • 我对您的问题感到满意并回答了它,但在我看来,这个标题完全具有误导性。像“一组复数”之类的东西会更接近你的真正问题。

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


【解决方案1】:

返回你想要的另一种可能性

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

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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
      

      【讨论】:

        【解决方案4】:
        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
        

        【讨论】:

          猜你喜欢
          • 2021-01-10
          • 1970-01-01
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 2012-09-22
          • 2010-09-06
          相关资源
          最近更新 更多