查询从mmsql中的表中的最大数生成增量值

时间:2018-06-18 07:18:41

标签: sql sql-server-2008

样本表: -

CREATE TABLE emp1 
(
    seq_number int,
    empid int,
    ename varchar(50),
    deptno int,
    designation varchar(50),
    sal int,
    loc varchar(50)
)

插入

INSERT INTO emp1
VALUES (1, 458956, 'john', 10, 'Clerk', 1000, 'London'),
       (2, 212854, 'Joseph', 20, 'CA', 7000, 'USA'),
       (3, 100247, 'Arjun', 30, 'Manager', 10000, 'India'),
       (4, 326856, 'Jim', 40, 'Senior Clerk', 6000, 'China'
       (null 203323, 'Catherine', 40, 'Senior Clerk', 6000, 'China'),
       (null, 152830, 'Mario', 60, 'BDM', 12000, 'Canada'),
       (null, 200674, 'George', 10, 'SSE', 7000, 'Japan');

我尝试使用oracle 11g工作,但我想在mssql中。 oracle查询: -

SELECT
    nvl (v.seq_number, v.m_seq + ROW_NUMBER () OVER (ORDER BY v.seq_number nulls FIRST, v.empid)) seq_number, v.empid, v.ename, v.loc, v.STATUS
FROM 
    (SELECT
         e2.seq_number,
         MAX(e2.seq_number) OVER () m_seq
     FROM 
         emp2 e2
     LEFT JOIN 
         emp1 e1 ON e1.seq_number = e2.seq_number) v
WHERE 
    v.status IS NOT NULL
ORDER BY seq_number

我要求在考虑seq_number的最大值时生成seq_number。如果seq_number从那里为空,它应该生成下一个seq_number。

O / P: -

101 458956  John    10  Clerk   1000    London
102 212854  Joseph  20  CA  7000    Canada
103 100247  Arjun   30  Manager 10000   India
104 326856  Jim 40  Senior Clerk    6000    China
105 203323, 'Catherine', 40, 'Senior Clerk', 6000, 'China'
106, 152830, 'Mario', 60, 'BDM', 12000, 'Canada'
107, 200674, 'George', 10, 'SSE', 7000, 'Japan'.

1 个答案:

答案 0 :(得分:0)

对查询的唯一更改是将nvl()更改为coalesce()ORDER BY

SELECT COALESCE(v.seq_number,
                (v.m_seq + 
                 ROW_NUMBER () OVER (ORDER BY (CASE WHEN v.seq_number IS NULL THEN 1 ELSE 2 END),
                                               v.seq_number, v.empid
                                              )
                                    ) seq_number, v.empid, v.ename, v.loc, v.STATUS
FROM (SELECT e2.seq_number, MAX(e2.seq_number) OVER () as m_seq
      FROM emp2 e2 LEFT JOIN 
           emp1 e1
           ON e1.seq_number = e2.seq_number
     ) v
WHERE v.status IS NOT NULL
ORDER BY seq_number;

这也适用于Oracle。