sql - 根据另一列动态填充结果集中的列

Posted

技术标签:

【中文标题】sql - 根据另一列动态填充结果集中的列【英文标题】:sql - dynamically populate columns in a result set based on another column 【发布时间】:2014-02-11 16:36:37 【问题描述】:

我们想要确定客户已投保或未投保的资产数量。

基本上,保险金额为 85,000 英镑,我们按照账户流动性的顺序在客户持有的几种账户类型中进行分摊,例如,活期账户比 95 天通知账户更具流动性,因此活期账户会先收到钱...

我们有下面的代码,它根据账户类型生成优先级,当然我们现在可以遍历表格并确定每个客户的每种账户类型的保险金额,任何非保险金额都将成为无保险金额为那个客户。

但是有没有办法在主选择语句中做到这一点?

declare @Priorities TABLE
    (
    [refID] [int] IDENTITY(1,1) NOT NULL,
    acno nvarchar(10),
    Suffix nvarchar(6) null,
    Unit nvarchar(5) null,
    CT nvarchar(2) null,
    LOB nvarchar(2) null,
    Participants int null,
    VAL float null,
    xPriority int null,
    insuredAmt float null,
    uninsuredAmt float null
    )
declare @Count int=0
declare @I int=0

insert into @Priorities
select acno, suffix, unit, CT, LOB, Participants, Val, xPriority =
    case 
    when LOB BETWEEN 'GA' AND 'GN' then 1   -- Current accounts 
    when LOB IN ( 'HY' , 'H1') then 2   -- Call
    when CHARINDEX(LOB, 'HA; HC; HM; HQ; IA; IB; IC; IE;IG; IU;')>0 then 3      -- Instant Access       
        when LOB='HO' then 4    -- 14 Day notice
    when CHARINDEX(LOB, 'DN; HG; HK; HL; HP; HS; HU; IV; IW;')>0 then 5     -- 35-Day notice    
    when LOB IN ('DN', 'HV') then 6     -- 95-Day notice    
    when  (LOB BETWEEN 'IS' AND 'IT') or (LOB between 'JA' and 'JZ' ) then 7        -- Residual Deals   
    end, 
    insuredAmt=null, 
    uninsuredAmt=null
from actdata 
    where datadate =  '20131212' /*@processdate*/ 
        and CHARINDEX(CT, 'AA;AC;AE;AG;BA;BC;BE;BG;CA;DE;DG;ZA;')=0
        and LOB BETWEEN 'GA' AND 'KZ' And val>0 
        and participants is not null 
    order by acno

我想做的是根据xPriority 列的值计算每条记录的保险金额。

此外,我们将总保险金额乘以账户中的参与者人数,因此如果账户中有 5 名参与者,那么他们的总保险金额将为 5*85000 = 425000 英镑。

另一种选择是循环或游标。

当数据被另一个进程从 iSeries 系统带入报告数据库时,这将每天运行。

谢谢 菲利普

【问题讨论】:

【参考方案1】:

我相信答案是“否”,但这是基于对以下方面的特定解释: “此外,我们将总保险金额乘以账户中的参与者人数,因此如果账户中有 5 名参与者,那么他们的总保险金额将为 5*85000 = 425000 英镑。”

如果帐户中没有多个参与者,我认为可以按客户 ID 订购 SELECT 语句和 xPriority 的 CASE 语句,保持递减的运行总数(从 85K 下降并为每个客户重置)并计算保额并相应地未投保。这将告诉您每个人的保险金额是如何在他们的账户中分配的。

但是,如果有多个参与者,您必须解决以下问题:

玛丽有一个 4 万英镑的活期账户和一个 2 万英镑的 30 天通知账户。

Bob 有一个 5 万英镑的活期账户和一个 2 万英镑的 30 天通知账户。

玛丽和鲍勃还有一个 6 万英镑的 14 天通知联合账户。

两个活期账户已全额投保,14 天通知账户也是如此(Mary 还剩 45,000 英镑,Bob 还剩 35,000 英镑)。问题在于,两个 30 天账户的承保范围取决于哪个个人的保险被分配到联名账户(玛丽的全部保险加上鲍勃的一点;鲍勃的全部加上玛丽的一点;每个 3 万英镑;9:7玛丽:鲍勃的比例?)。如果不参考账户的完整条款和条件,我认为这个问题甚至无法从逻辑上解决!在进行编程时,我建议您格外小心。从编写低效代码开始,您可以在这种情况下进行彻底测试,然后将其用作提高效率检查代码的基准。

祝你好运!

【讨论】:

以上是关于sql - 根据另一列动态填充结果集中的列的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 在填充另一列时继承派生列值

SQL - 根据另一列中的日期过滤一列的结果

从 Oracle 中的动态 SQL 获取结果集中的结果

MS SQL Server中的递归函数比较值

PHP / SQL - 获取另一列的总和

从另一列计算的列?