感谢您事先提供的任何帮助,我无法将我的SQL技能与这一项结合起来...
我有两个这样的表:
设置
Customerid ViewerLimit
1 50
2 50
发行
Customerid ServerIP
1 stream3
1 stream4
2 stream3
我想计算每个服务器上的负载。如果客户有多台服务器,则由客户来分担负载,因此客户1在这里将25的负载放在每台服务器上。我想要得到的结果是这样的:
ServerIP Load
stream3 75
stream4 25
我试图做一个和这个类似的求和函数:
sum(viewerlimit/(count # of servers)) as load group by serverip
但是我不能在sum函数内进行子查询。有很多客户,每个客户可能有很多服务器,因此手动操作将变得太复杂。感谢您的投入。
最佳答案
这是在衍生表中计数的非启发式版本:
select serverip, sum (viewerlimit/cast (ServerCount as float)) Load
from
(
select customerid, count(*) ServerCount from distribution group by customerid
) a
inner join settings
on a.customerid = settings.customerid
inner join distribution
on settings.customerid = distribution.customerid
group by serverip
Sql Fiddle to play around
更新-尝试解释
派生表用于生成可以连接到查询主体的临时结果集。它放在from子句中,并用括号括起来。您可以使用普通select可以使用的任何东西,top,order by,聚合函数等。您唯一不能使用的是与主体中的表的关联。哦,还有CTE。派生表必须为别名。
在先前的样本派生表中,“a”按客户ID选择服务器的数量。主体将其视为具有CustomerId和ServerCount列的表,可以用作所有列出的表中的任何列。在设置和“a”之间执行对customerid的联接。因为这是1:1关系(两个表在给定一个customerid的情况下都产生单行),所以不会发生重复。
关于带子查询的SQL Sum?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9985674/