我试图在一次选择中执行以下操作。我们有一个包含公司记录和用户记录的 SAAS。AUser
是Company
( Company.CompanyId = User.CompanyId
) 的成员。在用户记录中,我们跟踪该用户(当月)的带宽使用情况。
我需要做一个选择,为我提供每个用户使用超过 1GB 带宽的所有公司。我可以通过公司使用以下方式获得这家公司:
select count(*) as numUsers,
sum(BandwidthThisMonth) as totalBandwidth
from [User]
where [User].CompanyId = @CompanyId
这种方法的问题是我必须首先获取每个公司的 CompanyId,然后一个一个地提取这些数据。而我只需要找到使用量超过 1GB/user 的情况,这种情况很少见。
有没有办法做这样的事情:
select
CompanyId,
count(*) as numUsers,
sum(BandwidthThisMonth) as totalBandwidth
from Company, [User]
where totalBandwidth - (numUsers*1000000000))/1000000000 > 0
count()
&在哪里sum()
仅针对用户记录在哪里User.CompanyId = Company.CompanyId
?
GROUP BY
该HAVING
条款就是您要查找的内容。GROUP BY 允许您使用聚合函数,而不必像当前那样只有 1 行数据。在这里,我们将计算所有用户的数量以及该公司所有用户的总带宽。我不太明白你的引爆点,所以那里的逻辑可能不对。我想我正在读它作为“我们在所有这些用户之间共享 1GB 的数据”HAVING 类似于我们的 WHERE,但对 GROUPed BY 数据进行操作。在这里我指定我只想要总带宽超过 1GB 的行。
除非您需要 Company 表中的某些内容,否则没有真正的理由将它们添加到查询中,因为您的所有数据都在 User 记录中。