创建具有定义的行数的SELECT

时间:2019-10-21 04:09:21

标签: sql-server

我有一个存储过程,应该根据amount的值在表中插入一些随机行

@amount1 INT --EligibilityID = 1
@amount2 INT --EligibilityID = 2
@amount3 INT --EligibilityID = 3

也许最明显的方法是使用TOP(@amount),但是数量值很多,第二个选择要大得多。因此,我一直在寻找一种在可能的情况下在单个语句中完成此操作的方法。

INSERT INTO [dbo].[CaseInfo]
  SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
  FROM (
    SELECT TOP(@amount1) [EligibilityID],[CaseNumber],[CaseMonth]
    FROM [dbo].[tempCases]
    WHERE [EligibilityID] = 1
  )

INSERT INTO [dbo].[CaseInfo]
  SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
  FROM (
    SELECT TOP(@amount2) [EligibilityID],[CaseNumber],[CaseMonth]
    FROM [dbo].[tempCases]
    WHERE [EligibilityID] = 2
  )

INSERT INTO [dbo].[CaseInfo]
  SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
  FROM (
    SELECT TOP(@amount3) [EligibilityID],[CaseNumber],[CaseMonth]
    FROM [dbo].[tempCases]
    WHERE [EligibilityID] = 3
  )

1 个答案:

答案 0 :(得分:1)

我建议使用row_number,并按eligibilityID进行分区,然后将其与case语句进行比较,以每次都选择正确的变量:

INSERT INTO [dbo].[CaseInfo]
  SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
  FROM (
    SELECT [EligibilityID],[CaseNumber],[CaseMonth]
           ,row_number() over (partition by EligibilityID order by CaseNumber) as rn -- you haven't mentioned an ORDER BY, you can change it here
    FROM [dbo].[tempCases]
  ) as table1
  where rn<=case
                when EligibilityID=1 then @amount1
                when EligibilityID=2 then @amount2
                when EligibilityID=3 then @amount3
            end