SQL Server中的自动增量列值

时间:2019-04-16 04:51:12

标签: sql sql-server-2012

我有两列SALARY_CODEFN_YEAR 我想在FN_YEAR列的基础上生成如下表: 如果FN_YEAR的值为18-19,则SALARY_CODE将为SAL/01-18-1918-19的SALARY_CODE的下一个值为SAL/02-18-19

enter image description here

请帮助我编写SQL来执行所讨论的任务。

4 个答案:

答案 0 :(得分:1)

DECLARE @intCount int=0;
DECLARE @CustomID nvarchar(16);
DECLARE @fn_year nvarchar(16)='19-20';

SELECT @intCount = Count(SALARY_CODE) FROM temptest WHERE FN_YEAR=@fn_year
IF(@intCount = 0)
BEGIN
    set @CustomID='SAL/1-'+ @fn_year
    insert into temptest values (@CustomID,@fn_year)
END
ELSE
BEGIN
        SET @CustomID= 'SAL/'+ CAST(@intCount+1 as nvarchar(16)) +'-'+@fn_year;
        insert into temptest values (@CustomID,@fn_year)
END

您可以编写如下功能:

CREATE FUNCTION dbo.getSalaryCode(@fn_year NVARCHAR(16))  
RETURNS NVARCHAR(16)   
AS   
-- Returns the SALARY_CODE 
BEGIN  
    DECLARE @intCount int=0;
    DECLARE @CustomID nvarchar(16);

    SELECT @intCount = Count(SALARY_CODE) FROM temptest WHERE FN_YEAR=@fn_year
    IF(@intCount = 0)
    BEGIN
        SET @CustomID='SAL/1-'+ @fn_year
    END
    ELSE
    BEGIN
        SET @CustomID= 'SAL/'+ CAST(@intCount+1 as nvarchar(16)) +'-'+@fn_year;
    END
    RETURN @CustomID;  
END; 

答案 1 :(得分:0)

您可以将row_number()concatenate与另一列结合使用以获得所需的结果

with data as ( 
(select '18-19' FN_YEAR union all 
 select '18-19' union all 
 select '18-19' union all 
 select '19-20' union all 
 select '19-20' union all 
 select '20-21')   ) 
 select  FN_YEAR, 
        ('SAL/'+CAST((row_number() OVER (PARTITION BY FN_YEAR order by FN_YEAR)) AS VARCHAR(50))+'-'+FN_YEAR) 
        as SALARY_CODE from data

Check Demo Here

答案 2 :(得分:0)

创建一个包含12行(假设需要所有月份)的表(我们称其为mnths),并创建一个数字列(介于1到12之间)的索引列,以及另一个表(用于所需年份)。 然后为每个月和每年在该表中添加行,如下所示:

表名:mnths

字段名称:mnt(值:1-12)

表名:年

字段名称:yr(值:18-30)

SELECT 'SAL/'+CAST(mnt as nvarchar(2))+'-'+
CAST(yr as nvarchar(2))+'-'+CAST(yr+1 as nvarchar(2)) as SALARY_CODE, 
CAST(yr as nvarchar(2))+'-'+CAST(yr+1 as nvarchar(2)) as FN_YEAR
FROM mnths cross join years

如果您已经有了数据,则可以针对这些表进行验证并添加缺失的条目。

答案 3 :(得分:0)

Divya Agrawal的回答非常好。但是我认为您需要的是触发,以便在您在表上插入内容时自动填充这些值。以下过程是如何执行此操作的示例。 ID是您的表主键。

CREATE TRIGGER [dbo].[Salary_MyTable]
ON [dbo].[MyTable]
AFTER INSERT
AS
BEGIN
@Id
SELECT @Id = INSERTED.Id FROM INSERTED
SELECT @fn_year= INSERTED.FN_YEAR FROM INSERTED
SELECT @intCount = Count(SALARY_CODE) FROM temptest WHERE FN_YEAR=@fn_year

UPDATE [dbo].[MyTable] SET [SALARY_CODE]= 'SAL/' + CAST(@intCount+1 as nvarchar(16)) +'-'+@fn_year) WHERE @Id = Id

END
相关问题