SQL-拆分数据行并分配分数值

时间:2019-03-19 13:58:01

标签: sql sql-server

我对标题不佳表示歉意,因为我不知道如何最好地用它来表达。

我有一个表,通过它我可以返回如下行:

Opener  | Closer  | Policy Ref | Transaction Type
Agent A | Agent B | ABCD01EF01 | New Business
Agent C | Agent C | ZYXA01EF01 | New Business

创建代码

    CREATE TABLE #temptable ( [Opener] varchar(50), [Closer] varchar(50), [PolicyRef] varchar(10), [Transaction Type] varchar(14) )
INSERT INTO #temptable
VALUES
( 'Agent C', 'Agent C', 'ZYXA01EF01', 'New Business' ), 
( 'Agent A', 'Agent B', 'ABCD01EF01', 'New Business' )

DROP TABLE #temptable

我们目前暂时基本得分超过1.0,如果Opener = Closer,则每一行的得分都应为1.0,并且仅返回一行,但是Opener <> Closer的得分应为2行在“开瓶器”和“开瓶器”之间将“得分”分配为0.5,结果应该是这样

Agent   | Policy Ref | Transaction Type | Score
Agent A | ABCD01EF01 | New Business     | 0.5 
Agent B | ABCD01EF01 | New Business     | 0.5
Agent C | ZYXA01EF01 | New Business     | 1.0

我当时想对row_numbering进行交叉应用,以定义每个“ Policy Ref”是否超过1行,但是我似乎无法使其正常工作。

我以前已经做过,但是这是一个使用临时表和cte来更新和移动信息的存储过程,如果您愿意,我正在寻找“低脂”版本。

3 个答案:

答案 0 :(得分:2)

另一个选择是 UNION ALL

示例

Select *
      ,Score = 1.0  / sum(1) over(partition by PolicyRef) 
 From  (
        Select Agent = Opener
             ,PolicyRef
             ,[Transaction Type]
         from #temptable
        Union All
        Select Agent = Closer
             ,PolicyRef
             ,[Transaction Type]
         from #temptable
         Where Opener<>Closer
       ) A

返回

enter image description here

答案 1 :(得分:1)

applycase表达式一起使用:

select v.agent, t.policy_ref, t.transaction_type, v.score
from #temptable t cross apply
     (values (opener, (case when t.opener = t.closer then 1.0 else 0.5 end)),
             (case when t.opener <> t.closer then t.closer end, 0.5)
     ) v(agent, score)
where v.agent is not null;

或者:

select v.agent, t.policy_ref, t.transaction_type,
       (case when t.opener = t.closer then 1.0 else 0.5 end) as score
from #temptable t cross apply
     (values (t.opener, 1),
             (t.closer, 2)
     ) v(agent, which)
where (t.opener <> t.closer) or (which = 1)

答案 2 :(得分:0)

我似乎您正在尝试创建一个过于复杂的表,以便将数据最好地组织在多个表中。这应该可以帮助您解决计数问题。

创建多个表对我来说很有意义,以便您可以分配唯一的键。 我将为每个策略引用创建一个具有唯一键的策略表 然后是每个代理的另一个表,每个代理具有唯一的密钥。 然后是第三个表,它与您创建的表类似。

Opener  | Closer  | Policy Ref | Transaction Type
Agent A | Agent B | ABCD01EF01 | New Business
Agent C | Agent C | ZYXA01EF01 | New Business

然后通过联接和计算字段进行低谷查询,即可构建得分表。

Agent   | Policy Ref | Transaction Type | Score
Agent A | ABCD01EF01 | New Business     | 0.5 
Agent B | ABCD01EF01 | New Business     | 0.5
Agent C | ZYXA01EF01 | New Business     | 1.0

然后,您可以为每个策略引用使用代理计数。

您可能还有其他更简单或更优雅的方法来执行此操作,但是至少我认为这应该可行。