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行)例如:对于保单Id1
,代理人的Id是100
,付费123
第#3)行)例如:对于保单Id3
,代理人的Id为999
,付费741
,另一代理人的Id为100
付费874
(表达方式不是如何正确完成,而是我如何将其作为事实)
我怎样才能知道代理ID100
总共支付了多少钱?
(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将“人类可读查询”转换为内部访问计划。如果为代理字段编制索引,则将避免对整个表进行扫描。