AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 78624
Accepted
David Thielen
David Thielen
Asked: 2014-10-08 11:50:24 +0800 CST2014-10-08 11:50:24 +0800 CST 2014-10-08 11:50:24 +0800 CST

Usando count() e sum() em um cálculo em um select

  • 772

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?

select
  • 1 1 respostas
  • 113 Views

1 respostas

  • Voted
  1. Best Answer
    billinkc
    2014-10-08T19:14:48+08:002014-10-08T19:14:48+08:00

    GROUP BYe a HAVINGclá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.

    SELECT
        U.CompanyId
    ,   COUNT(*) as numUsers
    ,   SUM(U.BandwidthThisMonth) as totalBandwidth 
    FROM 
        Company C
        INNER JOIN
            [User] U
            ON U.CompanyId = C.CompanyId
    GROUP BY
        U.CompanyId
    HAVING
        -- this assumes storage vendor math and not true GB
        -- As a consumer, I'd expect 1GB of bandwidth to be 1 073 741 824
        SUM(U.BandwidthThisMonth) > 1000000000;
    
    • 3

relate perguntas

  • Deslocar dados do banco de dados para outra coluna

  • Como usar variáveis ​​dentro de um select (SQL Server)?

  • Seleção mysql complexa

  • "Para cada grupo de resultados cumprindo a condição X, selecione apenas o resultado com o menor valor da coluna A"

  • Como SELECIONAR a partir dos resultados SHOW TABLE STATUS

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve