【问题标题】:Assign a column value from a list of values in a loop in SQL从 SQL 循环中的值列表中分配列值
【发布时间】:2018-01-25 03:39:41
【问题描述】:

我确信其他人不得不做类似的事情,但我很难找到我需要的示例。

我有一个可能随时间变化的数组。我正在尝试使用该数组在我的团队之间平均分配我的帐户组合。我无法直接更改 SQL 数据库,因此我必须通过 XML 提取并重新上传来完成此操作。

这是伪代码(请原谅我写了奇怪的伪代码):

    Declare @Collector as array
    Declare @LoopedValue as varchar (60)
    set    @Collector [Team1, Team2, Team3]

    Set @LoopedValue to index 0 of array

    For each row returned    

    SELECT

    '<LOAN UpdateFlag= "1" LoanNumber= "'+la.loan_number+'" CollectionOfficerNumber= "'+@LoopedValue+'"> </LOAN>'

    FROM loanacct la

    where
    la.portfolio_code_id = 1
    AND status_code_no = 0
    AND la.acctrefno not IN (SELECT las.acctrefno from loanacct_statuses AS las where las.status_code_no IN  (11, 12, 13, 14, 17, 19, 20, 22, 26, 28, 35, 36, 38, 39, 62)
        )
        --Excludes accounts with Status Codes 11=Repossessed; 12=Pending Repo; 13=Bankruptcy Ch 7; 14=Charge-off; 17=Unsecured bad debt; 19=Clear to sell; 20=Bankruptcy Ch. 13; 22=Repo Sold; 26:Voluntary repossession; 28=Move to inventory; 35=Deficiency; 36=Unsecured Balance; 38=Discharged Ch 7 BK; 39=Discharged Ch13 BK: 62=Pre-Bankruptcy

Set @LoopedValue  to @LoopedValue+1. 
If @LoopedValue > 2 set @LoopedValue to 0 Else end
end

    ORDER by la.days_past_due desc

我的问题是,我到底要在@LoopedValue 部分中添加什么来实现 Column 1 = Team1、Column 2 = Team2、Column3 = Team3、Column4 = Team1 等结果?

我实际上不想在团队之间分配随机值,因为这可能会造成帐户难度的不平衡。

【问题讨论】:

  • 您好,欢迎来到 SO。我可以向您保证,您不想为此使用循环。但是,您在这里要做什么还不清楚。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • 我认为您可以在选择中使用 row_number() 并通过使用行号的模数按团队数得出索引。这将为三个团队生成索引 0、1、2、0、1、2 等的循环。

标签: sql-server


【解决方案1】:

根据我的评论建议的代码,使用 ROW_NUMBER() 和模数为团队创建一个循环索引。

-- Given table of loans =================================
    CREATE TABLE #Loan ( 
        Loan_Number int
        , Loan_Name varchar(30) 
        , Days_Past_Due int
        );

    INSERT INTO #Loan VALUES
        (23, 'First loan', 23),
        (34, 'alksdjfl', 12 ),
        (123, 'aswerjlj', 17 ),
        (324, 'asdasdf', 52 ),
        (8126, 'slaksjdrjlj', 80 ),
        (323, 'asdfasldfkj', 123 ),
        (224, 'alsdfal', 4 ),
        (2342, 'asldkfasldkj', 5 ),
        (451, 'asdlfjkasldjf', 67 )
        ;
-- =======================================================

-- Create and load a table with teams indexed starting at 1
Create Table #Team (TeamIX int, Team_Name varchar(50))
Insert into #Team 
    SELECT ROW_Number() OVER ( ORDER BY ( SELECT NULL) )  TeamIX
            , Team_Name from ( VALUES ( 'Team1' ), ('Team2'), ('Team3' ) ) TT(Team_Name) ;

-- Get the number of teams to use as the modulus divisor
DECLARE @TeamMax int; 
SELECT @TeamMax = COUNT(*) FROM #Team;


-- Create a temp table #FORXML of loans joined with teams by
-- allocating loan to team using modulus of row number
SELECT
 L.Loan_Number
 , L.TeamIX 
 , L.Loan_Name
 , T.Team_Name
 , L.Days_Past_Due
 INTO #FORXML
    FROM ( 
            SELECT ( 
                        -- TeamIX provides a cycling set of team numbers 1,2,3 etc up to the max team number
                        ROW_Number() OVER ( ORDER BY (SELECT Days_Past_Due ) DESC ) - 1 ) % @TeamMax + 1 TeamIX
                    , Loan_Number
                    , Loan_Name 
                    , Days_Past_Due
            FROM #LOAN 
        ) L
    JOIN #Team T
        ON T.TeamIX = L.TeamIX
    ;

-- Declare the xml variable to receive the generated XML
DECLARE @XML XML;

-- Generate the XML from the #FORXML table
SET @XML = '<LOANS>' + (
        SELECT Loan_Number [@LoanNumber]
                , TeamIX [@CollectionOfficerNumber] 
                , Loan_Name [@LoanName]
                , Team_Name [@TeamName]
                , Days_Past_Due [@DaysPastDue]
                FROM #FORXML FOR XML PATH ('LOAN') 
        ) + '</LOANS>';

    -- Report the XML for testing
    SELECT @XML XML;

-- CLEAN UP TEMP TABLES
Drop Table #Team;
Drop Table #Loan;
Drop Table #FORXML;

哪个代码给出了以下结果:

<LOANS>
  <LOAN LoanNumber="323" CollectionOfficerNumber="1" LoanName="asdfasldfkj" TeamName="Team1" DaysPastDue="123" />
  <LOAN LoanNumber="8126" CollectionOfficerNumber="2" LoanName="slaksjdrjlj" TeamName="Team2" DaysPastDue="80" />
  <LOAN LoanNumber="451" CollectionOfficerNumber="3" LoanName="asdlfjkasldjf" TeamName="Team3" DaysPastDue="67" />
  <LOAN LoanNumber="324" CollectionOfficerNumber="1" LoanName="asdasdf" TeamName="Team1" DaysPastDue="52" />
  <LOAN LoanNumber="23" CollectionOfficerNumber="2" LoanName="First loan" TeamName="Team2" DaysPastDue="23" />
  <LOAN LoanNumber="123" CollectionOfficerNumber="3" LoanName="aswerjlj" TeamName="Team3" DaysPastDue="17" />
  <LOAN LoanNumber="34" CollectionOfficerNumber="1" LoanName="alksdjfl" TeamName="Team1" DaysPastDue="12" />
  <LOAN LoanNumber="2342" CollectionOfficerNumber="2" LoanName="asldkfasldkj" TeamName="Team2" DaysPastDue="5" />
  <LOAN LoanNumber="224" CollectionOfficerNumber="3" LoanName="alsdfal" TeamName="Team3" DaysPastDue="4" />
</LOANS>

【讨论】:

  • 感谢您提供有关如何正确发帖的信息。我真的需要那个。 (我会尝试清理一下这篇文章以使其更清晰)。也就是说,您的解决方案非常接近我的需要。我唯一的问题是如何使用查询结果填充#Loan 表?
  • 对不起,最后一个问题很愚蠢。您的答案是正确的方法。但我确实不得不稍微调整一下,因为我无法在这个数据库中删除表(我知道,很糟糕)。也就是说,模数方法正是我所需要的。我将尝试调整帖子,使其看起来更好并包含我的最终答案。感谢您的帮助!
猜你喜欢
  • 2016-04-24
  • 2017-11-18
  • 1970-01-01
  • 2018-07-25
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
相关资源
最近更新 更多