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:

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.
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)