Sql server 是否获取Sql server中未知位置的的的总和?

Sql server 是否获取Sql server中未知位置的的的总和?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,有一份保险单,该保险单可由1-3名代理人支付 第1行)例如:对于保单Id1,代理人的Id是100,付费123 第#3)行)例如:对于保单Id3,代理人的Id为999,付费741,另一代理人的Id为100付费874 (表达方式不是如何正确完成,而是我如何将其作为事实) 我怎样才能知道代理ID100总共支付了多少钱? (123+541+874+557+471+552) 我有一个非常丑陋的工会解决方案 在规范化良好的模型中,这是一个简单的查询。您可以在CTE查询中“规范化”,然后求和: with c

有一份
保险单
,该保险单可由
1-3名代理人支付

第1行)例如:对于保单Id
1
,代理人的Id
100
,付费
123

第#3)行)例如:对于保单Id
3
,代理人的Id
999
,付费
741
,另一代理人的Id为
100
付费
874

(表达方式不是如何正确完成,而是我如何将其作为事实)

我怎样才能知道代理ID
100
总共支付了多少钱? (123+541+874+557+471+552)

我有一个非常丑陋的工会解决方案


在规范化良好的模型中,这是一个简单的查询。您可以在CTE查询中“规范化”,然后求和:

with cte as (
  select agent1id as id, agent1sum as s
  from insurance where agent1id is not null
 union all
  select agent2id as id, agent2sum as s
  from insurance where agent2id is not null
 union all
  select agent3id as id, agent3sum as s
  from insurance where agent3id is not null
)
select sum( s)
  from cte
 where id = 100

如果表中包含代理列的索引,则这是一种友好的索引方法。友好的索引查询可以避免全表扫描。

在规范化良好的模型中,这是一个简单的查询。您可以在CTE查询中“规范化”,然后求和:

with cte as (
  select agent1id as id, agent1sum as s
  from insurance where agent1id is not null
 union all
  select agent2id as id, agent2sum as s
  from insurance where agent2id is not null
 union all
  select agent3id as id, agent3sum as s
  from insurance where agent3id is not null
)
select sum( s)
  from cte
 where id = 100
如果表中包含代理列的索引,则这是一种友好的索引方法。友好的索引查询可以避免完整的表扫描。

如下所示

SUM(
   CASE WHEN agent1id=100 THEN agent1sum ELSE 0 END +
   CASE WHEN agent2id=100 THEN agent2sum ELSE 0 END +
   CASE WHEN agent3id=100 THEN agent3sum ELSE 0 END)
应该适当地聚合它。如果需要对所有代理执行此操作,我会使用代理表或在此查询之前使用CTE来获取不同的代理ID,然后替换上面的100

SUM(
   CASE WHEN agent1id=100 THEN agent1sum ELSE 0 END +
   CASE WHEN agent2id=100 THEN agent2sum ELSE 0 END +
   CASE WHEN agent3id=100 THEN agent3sum ELSE 0 END)

应该适当地聚合它。如果您需要对所有代理执行此操作,我会使用代理表或在此查询之前使用CTE来获取不同的代理ID,然后替换上面的100。

您指的是友好索引查询吗?超过agent1id,agent2id,agent3id?该表实际上将被扫描3次…DB optimizer将“人类可读查询”转换为内部访问计划。如果代理字段被编入索引,则可以避免对整个表进行扫描。您说的友好索引查询是什么意思?超过agent1id,agent2id,agent3id?该表实际上将被扫描3次…DB optimizer将“人类可读查询”转换为内部访问计划。如果为代理字段编制索引,则将避免对整个表进行扫描。