SQL实现数据行拆分与分数分配的精简方案问询
精简版SQL实现方案
刚好碰到过类似的需求,用CROSS APPLY配合VALUES构造行集是最简洁的方式,不用绕存储过程或者复杂CTE,直接一步到位:
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' ) -- 核心查询 SELECT v.Agent, t.PolicyRef, t.[Transaction Type], v.Score FROM #temptable t CROSS APPLY ( VALUES -- 优先处理Opener和Closer相同的情况,只返回一行1.0分 (t.Opener, 1.0) -- 当两者不同时,追加Closer的0.5分行 , CASE WHEN t.Opener <> t.Closer THEN (t.Closer, 0.5) ELSE NULL END ) v(Agent, Score) -- 过滤掉CASE生成的NULL行(也就是Opener=Closer时的第二行) WHERE v.Agent IS NOT NULL DROP TABLE #temptable
思路解释:
CROSS APPLY可以把每行数据和我们构造的小行集做关联,轻松实现行拆分逻辑。VALUES子句里,我们先默认生成Opener的行(分数1.0);然后用CASE判断,如果Opener和Closer不同,就再生成Closer的0.5分行,否则返回NULL。- 最后通过
WHERE v.Agent IS NOT NULL把不需要的NULL行过滤掉,刚好适配两种场景的需求。
执行结果:
| Agent | Policy Ref | Transaction Type | Score |
|---|---|---|---|
| Agent C | ZYXA01EF01 | New Business | 1.0 |
| Agent A | ABCD01EF01 | New Business | 0.5 |
| Agent B | ABCD01EF01 | New Business | 0.5 |
完全匹配你要的预期输出,代码精简且可读性拉满~
内容的提问来源于stack exchange,提问作者Lynchie
相关产品推荐
相关产品推荐

