我对标题不佳表示歉意,因为我不知道如何最好地用它来表达。
我有一个表,通过它我可以返回如下行:
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来更新和移动信息的存储过程,如果您愿意,我正在寻找“低脂”版本。
答案 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
返回
答案 1 :(得分:1)
将apply
与case
表达式一起使用:
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
然后,您可以为每个策略引用使用代理计数。
您可能还有其他更简单或更优雅的方法来执行此操作,但是至少我认为这应该可行。