JOINs e funções de agregação no Protheus
SELECT ... LEFT JOIN ... ON ... GROUP BY ...Relaciona tabelas e agrega resultados sem perder o contexto de filial.
Visão geral
JOIN define correspondência de chaves; GROUP BY agrupa linhas e COUNT/SUM calculam valores por grupo. Uma relação 1:N pode multiplicar linhas e distorcer totais do cabeçalho. No LEFT JOIN, filtros da tabela opcional devem ser avaliados no ON quando a intenção é manter registros sem correspondência. O exemplo monta uma string SQL e não a executa. Filial e exclusão lógica são aplicadas separadamente em cada tabela. A referência comunitária exemplifica JOIN e agregação, mas sua recomendação genérica de NOLOCK e suas escritas diretas não são adotadas. (Fontes: refs. 1–2.)
Sintaxe
SELECT ... LEFT JOIN ... ON ... GROUP BY ...Exemplo comentado
#Include "Protheus.ch"
User Function Ed500()
Local cSql := "SELECT A.A1_COD,A.A1_LOJA,COUNT(P.C5_NUM) AS QTD "
// Filtrar cada tabela conforme seu compartilhamento.
cSql += "FROM "+RetSqlName("SA1")+" A "
cSql += "LEFT JOIN "+RetSqlName("SC5")+" P ON "
cSql += "P.C5_CLIENTE=A.A1_COD AND P.C5_LOJACLI=A.A1_LOJA "
cSql += "AND P.C5_FILIAL='"+xFilial("SC5")+"' "
cSql += "AND P.D_E_L_E_T_=' ' "
cSql += "WHERE A.A1_FILIAL='"+xFilial("SA1")+"' "
cSql += "AND A.D_E_L_E_T_=' ' "
cSql += "GROUP BY A.A1_COD,A.A1_LOJA"
ConOut(cSql)
Return NilMostra SQL para contagem de pedidos por cliente/loja, incluindo grupos sem pedido; não abre cursor. Em revisão: exemplo editorial não compilado nem executado em Protheus. Conferir includes, release, RDD e contexto antes de homologar.
- Antes da execução, validar dicionário, permissões, cardinalidade, ChangeQuery, tipos e plano. Para dados externos, usar parâmetros do framework e evitar concatenação.
- Em revisão: exemplo editorial não compilado nem executado em Protheus. Conferir includes, release, RDD e contexto antes de homologar.

Comentários
Ainda não há comentários aprovados.
Entre com Google ou Microsoft para comentar.