Tabulação
Tabulação de dados é o processo de transformar dados normalizados em uma grade que os apresenta como se fossem o mesmo registro. Um exemplo comum é a exibição de estoque em grades de tamanhos e cores.
Para essa finalidade, utilizamos o #CROSSDATA em conjunto com o #PIVOT. Os retornos dessas funções são cadeias de caracteres que formam outras cadeias separadas por aspas e vírgulas. Componentes de relatórios e algumas funções de tela interpretam essa formatação para montar a grade final para o usuário.
#CROSSDATA
Definição: Com o auxílio de funções de agregação e do #PIVOT, cria uma grade de valores tabulados.
Utilidade: Montar relatórios com grades, como tamanhos no cabeçalho.
Especificação:
#CROSSDATA(colunas, (agrupamentos), omit_empty)- colunas: Nome(s) das colunas que receberão os dados agrupados.
- agrupamentos: Campos que definem o agrupamento, entre parênteses.
- omit_empty:
truepara omitir valores não encontrados no cabeçalho;falsecaso contrário.
Exemplo:
#CROSSDATA(quantidade, (cod_produto), true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_COUNT(e.cor AS numero_cores)
FROM produtos p
INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade);
SELECT tamanho AS tamanhos, tamanho
FROM tamanhos
WHERE grade = :data.grade;#CROSS_AVG
Definição: Auxiliar do #CROSSDATA; calcula a média simples de valores em uma coluna, respeitando o agrupamento definido.
Utilidade: Obter médias em dados tabulados.
Especificação:
#CROSS_AVG(campo AS alias)Exemplo:
#CROSSDATA(quantidade, (cod_produto), true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_AVG(e.saldo AS saldo_medio)
FROM produtos p
INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade);
SELECT tamanho AS tamanhos, tamanho
FROM tamanhos
WHERE grade = :data.grade;#CROSS_COUNT
Definição: Auxiliar do #CROSSDATA; conta a quantidade de ocorrências de valores em uma coluna, respeitando o agrupamento.
Utilidade: Contar itens em dados tabulados.
Especificação:
#CROSS_COUNT(campo AS alias)Exemplo:
#CROSSDATA(quantidade, (cod_produto), true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_COUNT(e.cor AS numero_cores)
FROM produtos p
INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade);
SELECT tamanho AS tamanhos, tamanho
FROM tamanhos
WHERE grade = :data.grade;#CROSS_FIRST
Definição: Auxiliar do #CROSSDATA; retorna a primeira ocorrência de valor em uma coluna, respeitando o agrupamento.
Utilidade: Obter o primeiro valor em dados tabulados.
Especificação:
#CROSS_FIRST(campo)Exemplo:
#CROSSDATA(quantidade, (cod_produto), true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_FIRST(e.obs)
FROM produtos p
INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade);
SELECT tamanho AS tamanhos, tamanho
FROM tamanhos
WHERE grade = :data.grade;#CROSS_SUM
Definição: Auxiliar do #CROSSDATA; soma os valores de uma coluna, respeitando o agrupamento.
Utilidade: Obter somatórios em dados tabulados.
Especificação:
#CROSS_SUM(campo)Exemplo:
#CROSSDATA(quantidade, (cod_produto), true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_SUM(e.saldo)
FROM produtos p
INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade);
SELECT tamanho AS tamanhos, tamanho
FROM tamanhos
WHERE grade = :data.grade;Macros Auxiliares
- #CROSS_SUM_FLD
- #CROSS_COUNT_FLD
- #CROSS_AVG_FLD
- #CROSS_FIRST_FLD
Definição: Funcionam de forma semelhante aos macros auxiliares correspondentes, mas são utilizados em contextos específicos.
#PIVOT
Definição: Auxiliar mandatório do #CROSSDATA; define o cabeçalho da tabulação desejada.
Utilidade: Estabelecer as colunas que serão utilizadas como cabeçalho na tabulação.
Especificação:
#PIVOT(coluna_cabecalho, campo_chave_principal, campo_chave_secundaria, coluna_quebra_opcional)Exemplo:
#PIVOT(tamanhos, tamanho, tamanho, grade);
SELECT tamanho AS tamanhos, tamanho
FROM tamanhos
WHERE grade = :data.grade;