SQL查询与子查询?

时间:2012-04-03 00:35:44

标签: sql

感谢您提前获得任何帮助,我无法将这些技能包装在这一个... 我有两张这样的表:

设置

  

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函数中进行子查询。每个客户有许多客户和可能的服务器很多,因此手动操作会变得太复杂。我很感激任何意见。

3 个答案:

答案 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

Sql Fiddle to play around

更新 - 尝试解释

派生表用于生成可以连接到查询主体的临时结果集。它被放置在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