SQL – Funções de agregação
As funções de agregação do SQL permitem que um conjunto de linhas sejam agregadas em uma única linha.
As funções de agregação podem otimizar a performance do sistema pois reduzem o número de linhas retornadas diminuindo o tráfego de rede.
Principais funções de agregação:
- COUNT() – Contagem de registros
- SUM() – Soma dos valores de uma expressão
- MAX() – Máximo valor de uma expressão
- MIN() – Mínimo valor de uma expressão
Ao informar uma função de agregação em um SELECT, não se pode trazer outros campos na seleção a menos que façam parte de uma cláusula GROUP BY. Isso ocorre porque a função de agregação é resultado de vários registros e não faz sentido trazer apenas um deles.
No exemplo abaixo, retornarei o saldo de um produto da tabela de Saldos Físico e Financeiro (SB2), independente de qual armazém ele está alocado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Static Function fSaldoSB2(cProduto) Local cQuery := "" Local nSaldo := 0 /* GetNextAlias() = Retorna um alias para ser utilizado no record set definido em dbUseArea() */ cAliasSB2 := GetNextAlias() /* RetSqlName = Retorna o nome físico da tabela, baseado em um alias, para ser usado em na contrução do "SELECT ... FROM TABELA" da query. */ cQuery := "SELECT SUM(B2_QATU) SALDOATUAL " cQuery += "FROM "+RetSqlName("SB2")+" SB2 " cQuery += "WHERE SB2.B2_FILIAL = '"+xFilial("SB2")+"' " cQuery += "AND SB2.D_E_L_E_T_ = '' " cQuery += "AND SB2.B2_COD = '" + cProduto + "' " /* ChangeQuery = Função de framework para compatibilizar a sintaxe das queries aos diferentes bancos de dados (SQL Server, Oracle, IBM DB2, Informix, MySql entre outros). Seu uso é obrigatório, salvo em casos especiais. */ cQuery := ChangeQuery(cQuery) /* dbUseArea = Efetua a criação de uma área de trabalho para o record set retornado por TcGenQry() */ dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAliasSB2,.T.,.T.) /* TcGenQry = Permite a abertuda de uma query diretamente no banco de dados utilizado na conexão atual, mediante uso da RDD TOPCONN. */ nSaldo := (cAliasSB2)->SALDOATUAL dbCloseArea() dbSelectArea("SB2") Return(nSaldo) |