Estou tentando fazer o seguinte em um único select. Temos um SAAS que possui registros da empresa e registros do usuário. A User
é membro de a Company
( Company.CompanyId = User.CompanyId
). No registro do usuário, rastreamos o uso da largura de banda desse usuário (para o mês).
Preciso fazer um select que me dê todas as empresas que já utilizaram mais de 1GB de banda por usuário. Eu posso obter esta empresa por empresa usando:
select count(*) as numUsers,
sum(BandwidthThisMonth) as totalBandwidth
from [User]
where [User].CompanyId = @CompanyId
O problema com essa abordagem é que primeiro preciso obter o CompanyId de cada empresa e, em seguida, extrair esses dados um por um. E só preciso encontrar os casos em que o uso é superior a 1 GB/usuário, o que é raro.
Existe uma maneira de fazer algo assim:
select
CompanyId,
count(*) as numUsers,
sum(BandwidthThisMonth) as totalBandwidth
from Company, [User]
where totalBandwidth - (numUsers*1000000000))/1000000000 > 0
Onde o count()
& sum()
são contra apenas os registros do usuário onde User.CompanyId = Company.CompanyId
?
GROUP BY
e aHAVING
cláusula são o que você está procurando. GROUP BY permite que você use funções de agregação sem ter que ter apenas 1 linha de dados como você faz atualmente. Aqui, vamos calcular a contagem de todos os usuários e a largura de banda total para todos os usuários dessa empresa. Não entendi bem o seu ponto de inflexão, então a lógica pode estar errada. Acho que estou lendo como "estamos compartilhando 1 GB de dados entre todos esses usuários"O HAVING é semelhante ao nosso WHERE, mas opera nos dados GROUPed BY. Aqui, especifiquei que desejo apenas linhas em que a largura de banda total seja superior a 1 GB.
A menos que você precise de algo da tabela Company, não há motivo real para adicioná-los à consulta, pois todos os seus dados estão no registro do usuário.