感谢您提前获得任何帮助,我无法将这些技能包装在这一个...
我有两张这样的表:
设置
Customerid ViewerLimit
1 50
2 50
分发
Customerid ServerIP
1 stream3
1 stream4
2 stream3
我想计算每台服务器上的负载。如果客户有多个服务器,则客户将负载分开,因此客户1在每个服务器上放置25个负载。我想要得到的结果是:
ServerIP 加载
stream3 75
stream4 25
我试着做一个与此相似的求和函数:
sum(viewerlimit/(count # of servers)) as load group by serverip
但我不能在sum函数中进行子查询。每个客户有许多客户和可能的服务器很多,因此手动操作会变得太复杂。我很感激任何意见。
答案 0 :(得分:6)
这是带有衍生表中的计数的未启发版本:
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
更新 - 尝试解释
派生表用于生成可以连接到查询主体的临时结果集。它被放置在from子句中并括在括号中。您可以使用普通选择可以使用的任何内容,顶部,排序依据,聚合函数等。您唯一不能使用的是与主体中的表相关联。哦,和CTE。派生表必须是别名。
在上一个示例派生表'a'中,按customerid选择服务器计数。主体将其视为具有CustomerId和ServerCount列的表,可以用作所有列出的表中的任何列。在设置和'a'之间执行customerid连接。因为这是1:1的关系(两个表都给出了一个customerid的单行),所以不会发生重复。
答案 1 :(得分:1)
如何在子查询中计算服务器数并将其分配给查询变量,然后在sum函数中使用该查询变量?
答案 2 :(得分:1)
select d.serverip, sum(s.viewerlimit/d.devider)
from (
select customerid, serverip, COUNT(serverip) over (partition by customerid) servercount
from distribution
) d
join settings s
on s.customerid=d.customerid
group by d.serverip