首页 > 解决方案 > SQL - 拆分数据行并分配得分值

问题描述

我为糟糕的标题道歉,因为我不知道如何最好地措辞。

我有一个表,我返回这样的行:

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,那么“Score”列应该是 1.0 并且只返回一行,但是如果 Opener <> Closer 应该有 2 行带有 '在 Opener 和 Closer 之间的得分为 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 来更新和移动信息的存储过程,如果你愿意的话,我正在寻找一个“低脂肪”版本。

标签: sqlsql-server

解决方案


另一个选择是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

退货

在此处输入图像描述


推荐阅读