Treinamento SAS Nome Aluno
Treinamento SAS Nome Aluno
Treinamento SAS Nome Aluno
<Nome Aluno> 1
Autores
Participação Especial
Agradecimentos
2
Sumário
1. INTRODUÇÃO ..................................................................................................................................................... 6
1.1 SOBRE A EMPRESA ..................................................................................................................................... 6
1.2 O QUE É SAS? ............................................................................................................................................. 6
2. COMO ACESSAR O SAS ....................................................................................................................................... 8
3. DATA SET ............................................................................................................................................................ 8
3.1 DROP = DATA SET OPTION .......................................................................................................................10
3.2 KEEP = DATA SET OPTION ........................................................................................................................11
3.3 OPTIONS COMPRESS = DATA SET OPTIONS .............................................................................................12
3.4 WHERE = DATA SET OPTION ....................................................................................................................12
4. STATEMENTS (DECLARAÇÕES) .........................................................................................................................13
4.1 LIBNAMES STATEMENT (DECLARAÇÃO)...................................................................................................13
4.2 FORMAT STATEMENT...............................................................................................................................15
4.3 LENGTH STATEMENT ................................................................................................................................19
4.4 RENAME STATEMENT ..............................................................................................................................20
4.5 PROC DELETE STATEMENT .......................................................................................................................21
4.6 IF-THEN/ELSE STATEMENT .......................................................................................................................21
4.7 IN STATEMENT .........................................................................................................................................24
4.8 DO WHILE STATEMENT ............................................................................................................................25
4.9 PROC CONTENTS STATEMENT (PROPRIEDADES DA TABELA) ..................................................................27
4.10 PROC SORT STATEMENT ..........................................................................................................................28
4.11 PROC IMPORT STATEMENT ......................................................................................................................30
4.12 PROC EXPORT STATEMENT ......................................................................................................................31
4.13 PROC FREQ STATEMENT ..........................................................................................................................32
4.14 PROC MEANS STATEMENT .......................................................................................................................32
4.15 PROC UNIVARIATE STATEMENT ...............................................................................................................33
4.16 PROC TABULATE STATEMENT ..................................................................................................................33
4.17 PROC SERVEYSELECT STATEMENT ...........................................................................................................34
4.18 PROC TRANSPOSE STATEMENT ................................................................................................................34
4.19 PROC FCMP STATEMENT (CRIAR SUA PRÓPRIA FUNÇÃO EM SAS) .........................................................36
4.20 MACRO STATEMENT ................................................................................................................................38
4.21 UPDATE STATEMENT................................................................................................................................39
4.22 DELETE STATEMENT .................................................................................................................................40
4.23 FILENAME SEND E-MAIL STATEMENT ......................................................................................................41
5. FUNÇÕES ..........................................................................................................................................................42
3
5.1 LENGTH FUNCTION ..................................................................................................................................42
5.2 SUBSTR FUNCTION ...................................................................................................................................44
5.3 OUTPUT STATEMENT ...............................................................................................................................46
5.4 INPUT FUNCTION .....................................................................................................................................47
5.5 PUT FUNCTION .........................................................................................................................................48
5.6 SCAN FUNCTION.......................................................................................................................................50
5.7 ROUND FUNCTION ...................................................................................................................................51
5.8 FLOOR FUNCTION ....................................................................................................................................52
5.9 CELL FUNCTION ........................................................................................................................................53
5.10 INT FUNCTION ..........................................................................................................................................54
5.11 LOWCASE FUNCTION ..............................................................................................................................55
5.12 UPCASE FUNCTION...................................................................................................................................56
5.13 PROPCASE FUNCTION ..............................................................................................................................58
5.14 INDEX FUNCTION .....................................................................................................................................59
5.15 %LET STATEMENT ....................................................................................................................................61
5.16 %SYSFUNC FUNCTION ..............................................................................................................................62
5.17 %EVAL FUNCTION ....................................................................................................................................63
5.18 DATETIME FUNCTION ..............................................................................................................................64
5.19 DATE FUNCTION .......................................................................................................................................65
5.20 DAY FUNCTION .........................................................................................................................................66
5.21 MONTH FUNCTION ..................................................................................................................................67
5.22 YEAR FUNCTION .......................................................................................................................................68
5.23 MDY FUNCTION........................................................................................................................................69
5.24 DATEPART FUNCTION ..............................................................................................................................71
5.25 INTNX FUNCTION .....................................................................................................................................72
5.26 INTCK FUNCTION ......................................................................................................................................73
5.27 WEEKDAY FUNCTION ...............................................................................................................................74
5.28 COMPRESS FUNCTION .............................................................................................................................76
5.29 TRANWRD FUNCTION ..............................................................................................................................78
5.30 TRIM FUNCTION .......................................................................................................................................80
5.31 SUM FUNCTION........................................................................................................................................81
6. SQL PROCEDURE REFERENCES .........................................................................................................................82
6.1 INNER JOIN PROCEDURE ..........................................................................................................................82
6.2 OUTER JOIN PROCEDURE .........................................................................................................................83
6.3 LEFT JOIN PROCEDURE .............................................................................................................................83
6.4 FULL JOIN PROCEDURE ............................................................................................................................84
4
6.5 RIGHT JOIN PROCEDURE ..........................................................................................................................85
6.6 SELECT CASE PROCEDURE ........................................................................................................................86
6.7 BETWEEN PROCEDURE.............................................................................................................................88
7. ROUTINE ...........................................................................................................................................................89
7.1 CALL SYMPUT ROUTINE ...........................................................................................................................89
7.2 CALL SLEEP ROUTINE (CHAMADA ROTINA DE SONO)..............................................................................89
8. CRIANDO UM CONTADOR ................................................................................................................................90
9. ADD ABBREVIATION .........................................................................................................................................91
10. EXERCÍCIOS ...................................................................................................................................................94
10.1 Exercício 1 ................................................................................................................................................94
10.2 Exercício 2 ................................................................................................................................................94
10.3 Exercício 3 ................................................................................................................................................95
10.4 Exercício 4 ................................................................................................................................................96
10.5 Exercício 5 ................................................................................................................................................97
10.6 Exercício 6 ................................................................................................................................................98
10.7 Exercício 7 ................................................................................................................................................99
11. ANOTAÇÕES .................................................................................................................................................99
12. BIBLIOGRAFIA .............................................................................................................................................101
5
1. INTRODUÇÃO
1.1 SOBRE A EMPRESA
SAS, ou "Statistical Analysis System", é o nome de uma empresa pioneira em Business intelligence e de
uma família de softwares gerenciadores de bancos de dados comercializados por ela. A empresa se chamava
SAS Institute até 2001, a partir de então teve seu nome alterado para SAS.
A empresa SAS Inc. fica em Cary, Carolina do Norte, Estados Unidos, e tem sido uma das maiores produtoras de
softwares voltados para Business Intelligence, desde a sua fundação em 1976 por Anthony Barr, James
Goodnight, John Sall e Jane Helwig. Originalmente SAS era um acrônimo de Sistema de Análises Estatísticas
(Statistical Analysis System). Seu maior uso comercial no início da carreira era na agronomia, para medir e
estimar o tamanho das colheitas. Até hoje, o ministério da agricultura dos Estados Unidos ainda é um de seus
clientes.
Em 2001, o SAS Institute passou a se chamar SAS e remodelou seu logotipo e sua linha de produtos.
Com isso ele pretendia se descolar da imagem de fornecedor de software modular (uma atividade cada vez
menos rentável) e assumir a imagem de fornecedor de soluções integradas (uma atividade cada vez mais
rentável). Assim, o Sistema SAS deixou de existir para o mercado e passou a ser mostrado apenas as soluções
montadas com o Sistema SAS.
O SAS é um sistema integrado de aplicações para a análise de dados, que consiste de: Recuperação de
dados, Gerenciamento de arquivos, Análise estatística, Acesso a Banco de Dados, Geração de gráficos, Geração
de relatórios. Trabalha com quatro ações básicas sobre o dado: Acessar, Manipular, Analisar e Apresentar. Pode
ser instalado em diversos ambientes operacionais disponíveis no mercado, sendo os programas e arquivos
portáveis para qualquer um desses ambientes. Na verdade, é lendária sua portabilidade e disponibilidade.
Outro aspecto lendário do Sistema SAS é a habilidade de acessar praticamente qualquer formato de dado, em
qualquer base. Mesmo bases de dados descontinuadas comercialmente ainda contam com possibilidade de
acesso via SAS. O módulo SAS/ACCESS to é o responsável por essa funcionalidade, bastando escolher o
adequado. Por exemplo, SAS/ACCESS to Adabas acessa o banco de dados Adabas. SAS/ACCESS to ODBC acessa
diversos formatos, todos mapeados através da interface ODBC. Formatos texto (CSV, TXT etc) e o próprio
formato SAS, são acessados nativamente pelo Base SAS, sem necessidade de nenhum outro módulo.
Sobre o SAS
O SAS é o líder mundial no segmento de inteligência analítica, o conjunto de processos, modelos e
tecnologias que ajuda empresas de diferentes setores da economia a entender em profundidade os próprios
negócios e também os mercados em que atuam. Desde 1976, o SAS dá a seus clientes em todo o mundo THE
POWER TO KNOW® (O Poder do Conhecimento).
6
As soluções do SAS são utilizadas para realizar análises em organizações com bancos de dados complexos,
solucionando problemas específicos que impactam os negócios dos seus clientes. O diferencial do SAS está
justamente na inteligência analítica, que possibilita transformar os dados já armazenados em informações
estratégicas, permitindo tomar as melhores decisões possíveis mais rapidamente, em cenários pré-
determinados pelos clientes.
No início desta década, o SAS adotou a estratégia de desenvolver soluções verticalizadas para resolver
problemas específicos de determinados setores. Alguns exemplos: bancos (detecção de fraudes, solução contra
lavagem de dinheiro, alocação de capital para operações de risco); varejo (verificação de produtos ideais para
perfil de cada loja, onde e quando); gás e petróleo (atividades de exploração, produção, refino, transporte e
comercialização); governo (onde colocar postos médicos e para quais doenças; locais e ocasiões em que é
preciso reforçar o policiamento); telecomunicações (custeio baseado em atividade, gerenciamento de
campanhas); educação (quais alunos têm mais probabilidade de reprovação, por quais razões e como evitar que
sejam repetentes), energia (níveis de consumo, riscos de apagão, onde e como evitar); agricultura (previsão de
safra, aumento de produção), manufatura (definição dos melhores preços para os itens fabricados), entre outras
inúmeras aplicações.
Esse pioneirismo está sendo bem aceito pelo mercado, visto os resultados que o SAS tem obtido. Com
mais de 45.000 instalações em todo o mundo - sendo que noventa e duas destas empresas estão presentes no
top 100 da Fortune 500 - o SAS teve um crescimento em 2009 de 2,2% nas vendas mundiais de soluções
analíticas, atingindo US$ 2,31 bilhões de faturamento. O SAS investe anualmente 23% da sua receita em
Pesquisa e Desenvolvimento (quase o dobro da média do mercado). Isso explica sua presença em diversas
verticais de negócio como varejo, telecomunicações, governo, finanças, manufatura, energia e educação.
No Brasil e no mundo o SAS tem uma sólida base de clientes em vários setores de atividade, especialmente nas
áreas de:
• finanças
• manufatura
• varejo
• energia
• telecomunicações
• governo
7
2. COMO ACESSAR O SAS
Iniciar > Todos os programas > SAS > Enterprise Guide 4.2
3. DATA SET
É um conjunto de dados SAS que contém valores de dados que são organizados em uma tabela de observações
(linhas) e variáveis (colunas) que podem ser processados pelo software SAS. Um conjunto de dados também
contém informação SAS descrito os tipos de dados e os comprimentos das variáveis. Ele também contém a
porção descritiva com as informações de data da criação, informação de variáveis, tamanho, usuário que criou e
etc. Segue abaixo um exemplo de criação de uma tabela SAS:
DATA
PROVISAO_AREAS_V1;
INPUT
DT_REF DATE11.
CDPASTA
NOME $ 23-44
AREA $ 45-56
PROVISAO;
FORMAT
DT_REF DDMMYY10.;
CARDS;
01JAN2014 000000000123 BILLY BARROS ITCV 1000
01JAN2014 000000000222 JULYANA B. CHOCOLATE DCRPF 1500
8
01JAN2014 000000000333 DANIEL R. WARDS xXx DCJE 20000
01FEB2014 000000000123 BILLY BARROS ITCV 1800
01FEB2014 000000000222 JULYANA B. CHOCOLATE DCRPF 1500
01FEB2014 000000000223 NEIDE MAÇÃ DCRPF 1500
01FEB2014 000000000124 TALITA O9BJ ITCV 1200
01FEB2014 000000000333 DANIEL R. WARDS xXx DCJE 20000
01MAR2014 000000000222 JULYANA B. CHOCOLATE DCRPF 1650
01MAR2014 000000000123 BILLY BARROS ITCV 1950
01MAR2014 000000000124 TALITA O9BJ ITCV 1300
01MAR2014 000000000333 DANIEL R. WARDS xXx DCJE 21050
01MAR2014 000000000334 FABIANA PULGA BATISTADCJE 250000
;
RUN;
(Observações)
6 01/02/2014 223 NEIDE MAÇÃ DCRPF 1500
Linhas
Colunas
(Variáveis)
9
3.1 DROP = DATA SET OPTION
Para um conjunto de dados de entrada, exclui as variáveis especificadas do processamento; para um conjunto
de dados de saída, exclui as variáveis especificadas sejam escritos para o conjunto de dados.
Sintaxe
DROP < variável> ;
/* CRIA TABELA */
DATA
PROVISAO_AREAS_V1_RETIRA(DROP=NOME);
SET
PROVISAO_AREAS_V1;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = PROVISAO_AREAS_V1_RETIRA;
RUN;
10
3.2 KEEP = DATA SET OPTION
Keep especifica as variáveis que serão mantidas para o conjunto de dados.
Sintaxe
KEEP < variável> ;
/* CRIA TABELA */
DATA
PROVISAO_AREAS_V1_MANTEM(KEEP=CDPASTA);
SET
PROVISAO_AREAS_V1;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = PROVISAO_AREAS_V1_MANTEM;
RUN;
Obs CDPASTA
1 123
2 222
3 333
4 123
5 222
6 223
7 124
8 333
9 222
10 123
11 124
12 333
13 334
11
3.3 OPTIONS COMPRESS = DATA SET OPTIONS
Ao executar esta opção, ao processar um DATA SET ou PROC SQL para criação de uma tabela, o SAS já criará a
mesma compactada. Faça um teste e crie uma tabela sem executar esta opção e veja o tamanho da tabela.
Depois execute esta opção e em seguida crie a mesma tabela e verá que o tamanho desta nova é muito menor
do que a anterior.
Exemplo 1:
No exemplo abaixo criamos a tabela FILTRO_BASE_PROV_EX1 apenas com os registros cujo a AREA = 'ITCV'.
DATA
FILTRO_BASE_PROV_EX1;
SET
PROVISAO_AREAS_V1;
WHERE
AREA = 'ITCV';
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA= FILTRO_BASE_PROV_EX1;
RUN;
12
Exemplo 2, usando proc sql e contains.
Neste exemplo criamos a tabela FILTRO_BASE_PROV_EX2 apenas com os registros cujo campo NOME contém o
texto 'ANA' em qualquer parte do texto.
PROC SQL;
CREATE TABLE
FILTRO_BASE_PROV_EX2 AS
SELECT
TAB1.*
FROM
PROVISAO_AREAS_V1 AS TAB1
WHERE
NOME CONTAINS 'ANA';
QUIT;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA= FILTRO_BASE_PROV_EX2;
RUN;
4. STATEMENTS (DECLARAÇÕES)
4.1 LIBNAMES STATEMENT (DECLARAÇÃO)
Associa ou desassocia uma biblioteca SAS com o libref (um nome de atalho), apaga um ou todos os librefs,
lista as características de uma biblioteca SAS, concatena bibliotecas SAS, ou concatena catálogos SAS.
Sintaxe:
Libname (<apelido do local de armazenamento>, <endereço de armazenamento>)
13
Exemplo 1: Atribuição e Utilização de um Libref (Nome atribuído)
Este exemplo atribui ao grupo de trabalho ACRF_WOR libref para um local de armazenamento de
agregação especificada entre aspas, como um nome de diretório físico. Esta etapa cria a ACRF_WOR. A tabela
PROVISAO_AREAS_V0 é armazena no local atribuído. O passo PRINT PROC faz referência a ele por seu nome de
dois níveis, ACRF_WOR.PROVISAO_AREAS_V0.
/* CRIA TABELA */
DATA
ACRF_WOR.PROVISAO_AREAS_V0;
INPUT
CDPASTA
;
CARDS;
000000000123
000000000222
000000000333
;
RUN;
/* CRIA TABELA */
PROC PRINT DATA= ACRF_WOR.PROVISAO_AREAS_V0;
RUN;
Obs CDPASTA
1 123
2 222
3 333
Quando o local de armazenamento dos dados pertencer a um servidor diferente do que o usuário esta alocado
é necessário à autenticação com o usuário e senha (lembrando que o usuário deve ter acesso ao servidor) ao
servidor especificado, neste caso o servidor HOSTNAME='SCXX004CAU-APP' SERVER=__8551.
Neste exemplo, passamos o usuário e senha através de duas macro variáveis USER (usuário) que neste caso é
preenchido automaticamente através da macro variável &_CLIENTUSERID disponível no SAS que captura
automaticamente o usuário logado na máquina e a PASS que é a senha do usuário logado. OBS: Você também
pode passar manualmente o usuário para macro variável USER se preferir.
15
/* CRIA TABELA */
DATA
PROVISAO_AREAS_V0;
INPUT
DT_REF DATE11.
CDPASTA
AREA $
PROVISAO
PROVISAO_ANTERIOR;
CARDS;
01JAN2014 000000000123 ITCV 1000 0
01JAN2014 000000000222 DCRPF 1500 .
01JAN2014 000000000333 DCJE 20000 15000
;
RUN;
Resultado do PROC PRINT:
Obs DT_REF CDPASTA AREA PROVISAO PROVISAO_ANTERIOR
Agora aplicamos o formato DDMMYY10., este é o formado com o dia, mês e ano com 10 posições incluindo as
barras.
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA= PROVISAO_AREAS_V0;
RUN;
16
Resultado do PROC PRINT:
O SAS possui inúmeros formatos e seria difícil informar todos em uma apostila, desta forma resolvemos passar
esta dica utilizando o query builder do SAS Guide. Para mostrar os formatos, abrimos uma tabela qualquer
existente conforme abaixo:
Primeiro inclua os campos na consulta (query) e depois selecione um campo para formata-lo, neste exemplo
selecionamos o campo DT_REF. Em seguida clique no botão propriedades depois aparecerá à caixa de dialogo
abaixo:
17
Agora clique no botão change. Após isso aparecerá diversos formatos que poderão ser selecionados de acordo
com a necessidade do usuário. Neste exemplo selecionamos a categoria Data (Date) e o formato em
PTGDFWDXw. que é um formato em Português como podemos visualizar no exemplo da caixa de dialogo
“janeiro”.
Feito isso o formato é preenchido. O formato escolhido poderá ser utilizado em qualquer função e formato em
DATA SET ou funções SAS.
18
Segue abaixo a tabela com o campo DT_REF formatado:
Sintaxe
LENGTH <nome da variavel><formato>;
19
/* CRIA TABELA */
DATA
PROVISAO_AREAS_V0_1;
SET
PROVISAO_AREAS_V0;
LENGTH STATUS $5.;
STATUS = 'ENCERRADO';
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA= PROVISAO_AREAS_V0_1;
RUN;
Sintaxe
RENAME <nome antigo>=<nome novo> ;
/* CRIA TABELA */
DATA
PROVISAO_AREAS_V1_RENAME(RENAME=(DT_REF=DATA_REFERENCIA));
SET
PROVISAO_AREAS_V1;
RUN;
20
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = PROVISAO_AREAS_V1_RENAME;
RUN;
Sintaxe
IF <expressão> THEN;
ELSE
21
Exemplo 1: Com apenas uma variável
No exemplo abaixo criamos a variável COD_AREA e a populamos de acordo com as condições estabelecidas, se
AREA = 'DCRPF' o COD_AREA = 1, se AREA = 'ITCV' o COD_AREA = 1, se AREA = 'DCJE' o COD_AREA = 2.
/* CRIA TABELA */
DATA
PROVISAO_CONDICAO_EX1;
SET
PROVISAO_AREAS_V1;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA= PROVISAO_CONDICAO_EX1;
RUN;
Obs DT_REF CDPASTA NOME AREA PROVISAO COD_AREA
22
Exemplo 2: Com n variáveis
No exemplo 2 criamos a variável COD_AREA e a variável SIGLA e as populamos de acordo com as condições
estabelecidas conforme exemplo 1 porém quando fazemos com mais de uma variável precisamos acrescentar
DO após o THEN e END para fechar o escopo, um para cada IF criado.
/* CRIA TABELA */
DATA
PROVISAO_CONDICAO_EX2;
SET
PROVISAO_AREAS_V1;
23
Obs DT_REF CDPASTA NOME AREA PROVISAO COD_AREA SIGLA
4.7 IN STATEMENT
Verifica se contém um conteúdo em uma variável.
Sintaxe
Exemplo:
No exemplo abaixo criamos a variável COD_AREA e a populamos com 1 se o campo AREA for 'DCRPF' ou 'ITCV' e
2 para os demais.
/* CRIA TABELA */
DATA
PROVISAO_CONDICAO_IN;
SET
PROVISAO_AREAS_V1;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA= PROVISAO_CONDICAO_IN;
RUN;
24
Obs DT_REF CDPASTA NOME AREA PROVISAO COD_AREA
Sintaxe
DO WHILE (expressão);
Tabela inicial
Obs DT_REF CDPASTA NOME AREA PROVISAO
Exemplo:
No exemplo abaixo utilizamos o DO WHILE para acrescentar 1.000 ao valor da provisão enquanto o valor da
provisão for menor ou igual a 5.000. Quando o valor se tornar maior que 5.000 o loop para e o valor final
acrescentado é populado na variável.
25
/* CRIA TABELA */
DATA
ACRESCIMO_PROVISAO;
SET
PROVISAO_AREAS_V1;
DO WHILE (PROVISAO <=5000);
PROVISAO + 1000;
END;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = TB_LINHA_COLUNA;
RUN;
Tabela final
Obs DT_REF CDPASTA NOME AREA PROVISAO
Teste de Mesa:
Obs DT_REF CDPASTA NOME AREA PROVISAO
2 01/01/2014 222 JULYANA B. CHOCOLATE DCRPF 1500
Sim é menor que 5.000 ? <= 1500 + 1000
Sim é menor que 5.000 ? <= 2500 + 1000
Sim é menor que 5.000 ? <= 3500 + 1000
Sim é menor que 5.000 ? <= 4500 + 1000
Não é menor que 5.000 ? <= 5500
26
4.9 PROC CONTENTS STATEMENT (PROPRIEDADES DA TABELA)
Listar os campos de uma tabela, bem como os atributos dos campos.
Engine V9 Indexes 0
Protection Compressed NO
Label
Filename /home/workp02/SAS_work287D01A000CA_scxx002cau/SAS_work0DC801A000CA_scxx002cau/provisao_areas_v0_1.sas7bdat
27
Alphabetic List of Variables and Attributes
3 AREA Char 8
2 CDPASTA Num 8
4 PROVISAO Num 8
5 PROVISAO_ANTERIOR Num 8
6 STATUS Char 5
Exemplo 1:
Neste exemplo criamos a tabela TB_PROV e multiplicamos o valor da provisão pelo fator 1.052315 no campo
PROV_AT e arredondamos o valor atualizado no campo PROV_AT_ROUND. Em seguida ordenamos por CDPASTA
e DTREF sendo o primeiro campo a ser ordenado CDPASTA e depois DTREF conforme resultado abaixo.
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = TB_PROV;
RUN;
28
Obs DT_REF CDPASTA NOME AREA PROVISAO PROV_AT PROV_AT_ROUND
/* ORDENA */
PROC SORT DATA = TB_PROV;
BY CDPASTA DT_REF;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = TB_PROV;
RUN;
Obs DT_REF CDPASTA NOME AREA PROVISAO PROV_AT PROV_AT_ROUND
29
Exemplo 2:
No exemplo 2, criamos a tabela TB_PROV2 através do PROC SORT retirando duplicação por pasta de acordo com
a ordem que aplicamos no exemplo 1. Quando a duplicação é retirada, mantem-se apenas o primeiro registro
de acordo com a ordem aplicada no exemplo 1.
BY CDPASTA;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = TB_PROV2;
RUN;
Obs DT_REF CDPASTA NOME AREA PROVISAO PROV_AT PROV_AT_ROUND
Realiza a importação de arquivo de dados. Para fazer automaticamente precisamos ter instalado no computador
local o aplicativo PC File Server 9.2 (Para SAS 4.2).
Exemplo:
Neste exemplo importamos o arquivo VP_DE_PARA_EXEMPLO.XLSX que se encontra no diretório local da
máquina para o SAS (Work).
Exemplo:
Neste exemplo exportamos a tabela SAS BASE_IMPORT (que encontra-se no WORK) apenas os registros cujo
campo SIGLA for igual 'BPF'. Exportamos para o diretório local em EXCEL com o nome
VP_DE_PARA_EXPORT.XLS.
/* EM WINDOWS */
PROC EXPORT DATA = BASE_IMPORT (WHERE=(SIGLA='BPF'))
OUTFILE="C:\USERS\MENOMAR\DESKTOP\FINANCAS\VP_DE_PARA_EXPORT.XLS"
/* AREA DE TRABALHO - COMPUTADOR LOCAL WINDOWS */
DBMS = EXCELCS /* EM EXCEL */
REPLACE; /* SOBREPOE O ARQUIVO SE EXISTIR */
SHEET = 'BASE_EXPORT'; /* CRIA A GUIA DE PLANILHA BASE_EXPORT */
SERVER = 'IU500010332545.CORP1.RC.ITAU'; /* NOME DA MÁQUINA LOCAL */
PORT = 8162; /* PORTA DO PC FILE SERVER */
RUN;
31
/* EM UNIX */
PROC EXPORT DATA = BASE_IMPORT (WHERE=(SIGLA='BPF'))
OUTFILE="/home/cau002/acrf/def/sgcoc/gpre/menomar/VP_DE_PARA_EXPORT.CSV"
/* SERVIDOR SAS - UNIX */
DBMS = CSV
REPLACE;
RUN;
32
Obs BASECONS _TYPE_ _FREQ_ freq media mediana
33
VLR_PROV_ATUAL
N Sum Min Mean Median Var P5 P25 P75 P90 P95 P99 Max Std
Base 4178699 46161836439 0.00 11046.94 3443.52 47525278607 5.09 1650.42 6922.70 15064.20 32326.59 103729.53 60208946.82 218002.93
AJC
DCJE 373917 2199355074.0 0.00 5881.93 2612.80 18356239834 0.00 1553.40 2629.49 2659.35 2659.35 4467.78 14846729.06 135485.20
DCRP 437316 842322682.69 -331658.62 1926.12 1861.39 2811680.50 0.00 959.24 2800.88 3952.25 4093.38 5832.47 208854.11 1676.81
ITCV 3271203 1763824552.9 -21350.57 539.20 469.53 3853580.65 -2456.11 -383.65 1606.38 2186.18 3525.92 7317.77 21350.57 1963.05
Total 8261135 50967338748 -331658.62 6169.53 1837.16 24897589869 -1843.17 451.29 3769.77 7887.30 15088.78 69227.01 60208946.82 157789.70
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=BD_PROVISAOSRS;
RUN;
Tabela Origem
Obs DT_REF CDPASTA NOME AREA PROVISAO PROV_AT PROV_AT_ROUND
1 01/01/2014 123 BILLY BARROS ITCV 1000 1052.32 1052
2 01/02/2014 124 TALITA O9BJ ITCV 1200 1262.78 1263
3 01/01/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 1578.47 1578
4 01/02/2014 223 NEIDE MAÇA DCRPF 1500 1578.47 1578
5 01/01/2014 333 DANIEL R. WARDS xXx DCJE 20000 21046.30 21046
6 01/03/2014 334 FABIANA PULGA BATISTA DCJE 250000 263078.75 263079
34
Exemplo 1:
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = TB_COLUNA_LINHA;
RUN;
35
Exemplo 2:
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = TB_LINHA_COLUNA;
RUN;
Exemplo:
Primeiramente precisamos listar a biblioteca a qual estaremos gravando esta função para posterior utilização e
neste caso escolhemos a ACRF_MEN (/home/cau002/acrf/def/sgcoc/gpre/menomar/) arquivo FUNCS.MATH.
Para utilização posterior basta lista o biblioteca de funções criada através do comando OPTIONS CMPLIB =
ACRF_MEN.FUNCS;. No exemplo criamos a função MOB que possui 2 parâmetros a ser passados DATA_INICIO e
36
DATA_FIM quando a função for chamada. Esta função faz um calculo para obter a quantidade de meses entre
duas datas de referencia, porém em formato numérico “201409”. O calculo é realizado e passado para a variável
RESULTADO que retorna o valor a função.
RESULTADO = (((SUBSTR(PUT(DATA_FIM,Z6.),1,4)*1)-
(SUBSTR(PUT(DATA_INICIO,Z6.),1,4)*1))*12)+
((SUBSTR(PUT(DATA_FIM,Z6.),5,2)*1)-
(SUBSTR(PUT(DATA_INICIO,Z6.),5,2)*1));
RETURN(RESULTADO);
ENDSUB;
Depois de criada a função chamamos a biblioteca (OPTIONS acima) podemos utilizer a função conforme
código abaixo, a quantidade de meses entre 201301 e 201310 é 9.
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = MESES_ENTRE_DTREF;
RUN;
Obs QTDE_MESES
1 9
37
4.20 MACRO STATEMENT
Começa uma definição de macro.
Sintaxe
%MACRO nome_da_macro (<parametros>);
Exemplo:
No exemplo abaixo criamos a macro função chamada ALTERA_NOME para fazer a alterações de nomes dentro
de uma tabela. A macro possui os parâmetros a serem informados: NOME_PARA (qual será o novo nome) e
NOME_DE (nome atual). Criada a macro, executamos a mesma que ficará em memória até que os parâmetros
sejam passados para macro. Para chamar a macro e passar os parâmetros para execução colocamos o % na
frente do nome da macro e passamos os parâmetros desta forma: %ALTERA_NOME('JULYANA B. CHOCOLATE',
'JULYANA YUMI');. Feito isso o Proc SQL que esta na macro receberá os parâmetros e será executado e irá
alterar o nome existente na tabela de 'JULYANA B. CHOCOLATE' para 'JULYANA YUMI'. Depois você poderá
chamar a macro N vezes como fizemos no exemplo depois (%ALTERA_NOME('NEIDE MAÇÃ', 'NEIDE BARROS'))
isso evita que você precise criar muitos programas, neste caso, muitos PROC SQL para fazer a mesma coisa
mudando apenas o parâmetro.
PROC SQL;
UPDATE PROVISAO_AREAS_V1
SET NOME = &NOME_PARA.
WHERE NOME = &NOME_DE.;
QUIT;
%MEND ALTERA_NOME;
/* CHAMANDA DA MACRO */
%ALTERA_NOME('JULYANA B. CHOCOLATE', 'JULYANA YUMI');
%ALTERA_NOME('NEIDE MAÇÃ', 'NEIDE BARROS');
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = PROVISAO_AREAS_V1;
RUN;
38
Obs DT_REF CDPASTA NOME AREA PROVISAO
Exemplo:
No exemplo abaixo atualizamos o campo NOME apenas do conteúdo 'BILLY BARROS' para 'BILLY
DICAS'. Vale lembrar que a alteração é definitiva na tabela origem e em caso de dúvida faça um backup
antes.
PROC SQL;
UPDATE PROVISAO_AREAS_V1
SET NOME = 'BILLY DICAS'
WHERE NOME = 'BILLY BARROS';
QUIT;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = PROVISAO_AREAS_V1;
RUN;
39
Obs DT_REF CDPASTA NOME AREA PROVISAO
/* CRIA TABELA*/
DATA
TB_EXCLUI_LINHA;
SET
BASE_ITCV;
IF
NOME='BILLY BARROS' THEN DELETE;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_EXCLUI_LINHA;
RUN;
BASE_ITCV
Obs DT_REF CDPASTA NOME AREA PROVISAO
Todas as linhas cujo campo nome estava populado com 'BILLY BARROS' foram excluídas.
40
4.23 FILENAME SEND E-MAIL STATEMENT
Envia e-mail utilizando o SAS.
41
/* ENVIA E-MAIL */
FILENAME SEND EMAIL SUBJECT="VP_DE_PARA"
TO="[email protected]"
CC = ("[email protected]")
TYPE="TEXT/HTML"
ATTACH = '/home/cau002/acrf/def/sgcoc/gpre/menomar/VP_DE_PARA_EXPORT.CSV';
RUN;
5. FUNÇÕES
Sintaxe
LENGTH (<texto>)
42
Exemplo: Criando um campo e contando a quantidade de caracteres
Neste exemplo criamos a tabela CONTAR_CARACTER a partir da tabela origem PROVISAO_AREAS_V1. Criamos
nesta nova tabela o campo QTDE_CARACTER e utilizamos a função LENGTH para contar a quantidade de
caracteres contida no campo área de cada linha da tabela.
/* CRIA A TABELA */
DATA
CONTAR_CARACTER;
SET
PROVISAO_AREAS_V1;
QTDE_CARACTER = LENGTH(NOME);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=CONTAR_CARACTER;
RUN;
43
5.2 SUBSTR FUNCTION
Substitui o valor definido na função.
Sintaxe
SUBSTR (<variável>, <posição> , <comprimento>) = conteúdo a substituir.
/* CRIA A TABELA */
DATA
SUBSTITUIR_TEXTO;
SET
PROVISAO_AREAS_V1;
IF AREA = 'ITCV' THEN
SUBSTR(AREA,3,6)="AUCRED";
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=SUBSTITUIR_TEXTO;
RUN;
Resultado do PROC PRINT:
Obs DT_REF CDPASTA NOME AREA PROVISAO
44
Exemplo 2: Criando um campo novo e substituindo parte do texto por vazio
No exemplo a seguir, criamos a tabela SUBSTITUIR_TEXTO_VAZIO a partir da tabela origem
PROVISAO_AREAS_V1. Nesta tabela criamos o campo ABREVIACAO_NOME, a partir do campo NOME mantendo
apenas os 3 caracteres a partir da primeira posição conforme Sintaxe passados para a função.
Dica: Quando criamos um campo texto sem informar a quantidade de posições que ele irá ter, o SAS por padrão
cria o campo com a quantidade de posições obtidas através do conteúdo da primeira linha criada, por exemplo,
se o conteúdo da primeira for “AU” ele terá duas posições, assim, se em outra linha o conteúdo for “AUDI”,
como o campo foi criado apenas com duas posições, o conteúdo será preenchido com “AU” apenas disprezando
o “DI”.
/* CRIA A TABELA */
DATA
SUBSTITUIR_TEXTO_VAZIO;
SET
PROVISAO_AREAS_V1;
ABREVIACAO_NOME = SUBSTR(NOME,1,3);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=SUBSTITUIR_TEXTO_VAZIO;
RUN;
45
5.3 OUTPUT STATEMENT
Utilizando o OUTPUT você conseguirá criar uma ou mais tabelas a partir de um DATA SET.
/* CRIA TABELA */
DATA BASE_ITCV
BASE_DCRPF
BASE_DCJE;
SET
PROVISAO_AREAS_V1;
IF AREA = 'ITCV' THEN
OUTPUT BASE_ITCV;
ELSE IF AREA = 'DCRPF' THEN
OUTPUT BASE_DCRPF;
ELSE
OUTPUT BASE_DCJE;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=BASE_ITCV;
RUN;
PROC PRINT DATA=BASE_DCRPF;
RUN;
PROC PRINT DATA=BASE_DCJE;
RUN;
Resultado dos PROC PRINTS:
BASE_ITCV
Obs DT_REF CDPASTA NOME AREA PROVISAO
46
BASE_DCRPF
Obs DT_REF CDPASTA NOME AREA PROVISAO
BASE_DCJE
Obs DT_REF CDPASTA NOME AREA PROVISAO
Retorna o valor que é produzido quando SAS converte uma expressão usando o informat especificado.
Sintaxe
INPUT(<variavel>, <formato>)
47
/* CRIA TABELA*/
DATA
TB_QTDE_PAES_NUMERICO;
SET
TB_QTDE_PAES;
QTDE_PAES_NUMERICO_V1 = INPUT(QTDE_PAES,10.);
QTDE_PAES_NUMERICO_V2 = QTDE_PAES*1;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_QTDE_PAES_NUMERICO;
RUN;
Sintaxe
PUT(<variavel >,<formato>)
48
Criamos o campo QTDE_PAES_TEXTO na tabela TB_QTDE_PAES_TEXTO e populamos o mesmo como o valor que
está contido no campo QTDE_PAES_NUMERICO_V1 da tabela TB_QTDE_PAES_NUMERICO que está em formato
numérico convertendo para texto utilizando a função PUT. Neste exemplo passamos a variável
QTDE_PAES_NUMERICO_V1 para função e o formato Z3. para que o mesmo converta para texto, porém
mantenha 3 posições conforme formato passado. Confira o resultado na tabela abaixo extraída do
processamento deste código.
/* CRIA TABELA*/
DATA
TB_QTDE_PAES_TEXTO;
SET
TB_QTDE_PAES_NUMERICO;
QTDE_PAES_TEXTO = PUT(QTDE_PAES_NUMERICO_V1,Z3.);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_QTDE_PAES_TEXTO;
RUN;
49
5.6 SCAN FUNCTION
Retorna a palavra enésima de uma cadeia de caracteres.
Sintaxe
SCAN(<texto>,<posição palavra>,<modificação>)
Exemplo:
Neste exemplo criamos dois campos, um para o primeiro nome e outro para o sobrenome. O campo
PRIMEIRO_NOME recebe o primeiro nome a partir do campo NOME oriundo da tabela PROVISAO_AREAS_V1 e
o campo SOBRENOME recebe o sobrenome (último) a partir do campo NOME também. Quando passamos o
número 1 na função SCAN para a <posição palavra> ele trará a primeira palavra e quando passamos o -1 ele
também trará a primeira na forma inversa, neste caso a última.
/* CRIA A TABELA */
DATA
TB_NOME_SOBRENOME;
SET
PROVISAO_AREAS_V1;
PRIMEIRO_NOME = SCAN(NOME,1,'');
SOBRENOME = SCAN(NOME,-1,'');
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_NOME_SOBRENOME;
RUN;
50
Obs DT_REF CDPASTA NOME AREA PROVISAO PRIMEIRO_NOME SOBRENOME
Arredonda o primeiro argumento para o múltiplo mais próximo do segundo argumento, ou para o número
inteiro mais próximo, quando o segundo argumento for omitido.
Sintaxe
ROUND (<argumento >, <arredondando>)
/* CRIA A TABELA */
DATA
TB_ARREDANDAMENTO_EX1 (DROP = NOME AREA);
SET
PROVISAO_AREAS_V1;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_ARREDANDAMENTO_EX1;
RUN;
51
Resultado do PROC PRINT:
Retorna o inteiro que é menor ou igual ao argumento para evitar imprevistos resultados de ponto flutuante,
resumindo arredonda o número para baixo.
Sintaxe
FLOOR (<argumento>)
/* CRIA A TABELA */
DATA
TB_ARREDANDAMENTO_EX2;
SET
TB_ARREDANDAMENTO_EX1;
PROV_AT_FLOOR = FLOOR(PROV_AT);
RUN;
52
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_ARREDANDAMENTO_EX2;
RUN;
Sintaxe
CEIL (<argumento>)
53
/* CRIA A TABELA */
DATA
TB_ARREDANDAMENTO_EX3;
SET
TB_ARREDANDAMENTO_EX2;
PROV_AT_CEIL = CEIL(PROV_AT);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_ARREDANDAMENTO_EX3;
RUN;
Sintaxe
INT (<argumento>)
54
Exemplo: Retorna a parte inteira de um número
Neste exemplo é criado o campo PROV_AT_INT em cima do campo da provisão atualizada. Utilizamos a função
INT para retorna a parte inteira da provisão.
/* CRIA A TABELA */
DATA
TB_ARREDANDAMENTO_EX4;
SET
TB_ARREDANDAMENTO_EX3;
PROV_AT_INT = INT(PROV_AT);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_ARREDANDAMENTO_EX4;
RUN;
Sintaxe
LOWCASE (<argumento>)
55
Exemplo: Converte as letras para minúscula
No exemplo abaixo descrito, é criado o campo NOME_MIN com base no campo NOME convertendo todas as
letras para minúsculas.
/* CRIA A TABELA */
DATA
TB_MINUSCULA;
SET
PROVISAO_AREAS_V1;
NOME_MIN = LOWCASE(NOME);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_MINUSCULA;
RUN;
3 01/01/2014 333 DANIEL R. WARDS xXx DCJE 20000 daniel r. wards xxx
8 01/02/2014 333 DANIEL R. WARDS xXx DCJE 20000 daniel r. wards xxx
12 01/03/2014 333 DANIEL R. WARDS xXx DCJE 21050 daniel r. wards xxx
13 01/03/2014 334 FABIANA PULGA BATISTA DCJE 250000 fabiana pulga batista
Sintaxe
UPCASE (<argumento>)
56
Exemplo: Converte as letras para maiúsculas
No exemplo abaixo descrito, é criado o campo NOME_MAI com base no campo NOME convertendo todas as
letras para maiúsculas.
Dica: Lembrando que o UNIX é case sensitive, existe diferença entre letras maiúsculas e minúsculas, assim,
podemos utilizar para evitar erros no cruzamento entre tabelas utilizando por exemplo o INNER JOIN.
/* CRIA A TABELA */
DATA
TB_MAIUSCULA;
SET
TB_MINUSCULA;
NOME_MAI = UPCASE(NOME_MIN);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_MAIUSCULA;
RUN;
1 01/01/2014 123 BILLY BARROS ITCV 1000 billy barros BILLY BARROS
2 01/01/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 julyana b. chocolate JULYANA B. CHOCOLATE
3 01/01/2014 333 DANIEL R. WARDS xXx DCJE 20000 daniel r. wards xxx DANIEL R. WARDS XXX
4 01/02/2014 123 BILLY BARROS ITCV 1800 billy barros BILLY BARROS
5 01/02/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 julyana b. chocolate JULYANA B. CHOCOLATE
6 01/02/2014 223 NEIDE MAÇÃ DCRPF 1500 neide MAÇÃ NEIDE MAÇÃ
7 01/02/2014 124 TALITA O9BJ ITCV 1200 talita o9bj TALITA O9BJ
8 01/02/2014 333 DANIEL R. WARDS xXx DCJE 20000 daniel r. wards xxx DANIEL R. WARDS XXX
9 01/03/2014 222 JULYANA B. CHOCOLATE DCRPF 1650 julyana b. chocolate JULYANA B. CHOCOLATE
10 01/03/2014 123 BILLY BARROS ITCV 1950 billy barros BILLY BARROS
11 01/03/2014 124 TALITA O9BJ ITCV 1300 talita o9bj TALITA O9BJ
12 01/03/2014 333 DANIEL R. WARDS xXx DCJE 21050 daniel r. wards xxx DANIEL R. WARDS XXX
13 01/03/2014 334 FABIANA PULGA BATISTA DCJE 250000 fabiana pulga batista FABIANA PULGA BATISTA
57
5.13 PROPCASE FUNCTION
Converte em maiúscula a primeira letra de todas as palavras.
Sintaxe
PROPCASE(<argumento>,<delimitador>)
/* CRIA A TABELA */
DATA
TB_PRI_MAIUSCULA;
SET
TB_MAIUSCULA;
NOME_PMAI = PROPCASE(NOME_MIN);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_PRI_MAIUSCULA;
RUN;
1 01/01/2014 123 BILLY BARROS ITCV 1000 billy barros BILLY BARROS Billy Barros
2 01/01/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 julyana b. chocolate JULYANA B. CHOCOLATE Julyana B. Chocolate
3 01/01/2014 333 DANIEL R. WARDS xXx DCJE 20000 daniel r. wards xxx DANIEL R. WARDS XXX Daniel R. Wards Xxx
4 01/02/2014 123 BILLY BARROS ITCV 1800 billy barros BILLY BARROS Billy Barros
5 01/02/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 julyana b. chocolate JULYANA B. CHOCOLATE Julyana B. Chocolate
6 01/02/2014 223 NEIDE MAÇÃ DCRPF 1500 neide MAÇÃ NEIDE MAÇÃ Neide MAÇÃ
7 01/02/2014 124 TALITA O9BJ ITCV 1200 talita o9bj TALITA O9BJ Talita O9bj
8 01/02/2014 333 DANIEL R. WARDS xXx DCJE 20000 daniel r. wards xxx DANIEL R. WARDS XXX Daniel R. Wards Xxx
9 01/03/2014 222 JULYANA B. CHOCOLATE DCRPF 1650 julyana b. chocolate JULYANA B. CHOCOLATE Julyana B. Chocolate
10 01/03/2014 123 BILLY BARROS ITCV 1950 billy barros BILLY BARROS Billy Barros
11 01/03/2014 124 TALITA O9BJ ITCV 1300 talita o9bj TALITA O9BJ Talita O9bj
12 01/03/2014 333 DANIEL R. WARDS xXx DCJE 21050 daniel r. wards xxx DANIEL R. WARDS XXX Daniel R. Wards Xxx
13 01/03/2014 334 FABIANA PULGA BATISTA DCJE 250000 fabiana pulga batista FABIANA PULGA BATISTA Fabiana Pulga Batista
58
5.14 INDEX FUNCTION
Pesquisas uma expressão de caracteres de uma sequência de caracteres e retorna a posição do primeiro
caractere da cadeia para a primeira ocorrência do texto.
Sintaxe
INDEX (<variavel>, <texto>)
/* CRIA A TABELA */
DATA
TB_INDEX_EX1;
SET
PROVISAO_AREAS_V1;
POSICAO = INDEX(NOME,'xXx');
IF INDEX(NOME,'xXx') THEN
VERDADEIRO = 'SIM';
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_INDEX_EX1;
RUN;
59
Obs DT_REF CDPASTA NOME AREA PROVISAO POSICAO VERDADEIRO
Exemplo 2: Procura texto em variável e atribui valor a um campo criado se a condição dor verdadeira
Neste exemplo criamos o campo NOVO_NOME e atribuímos um valor para ele se a condição estipulada for
verdadeira. Se o campo NOME contém o texto 'xXx' em qualquer parte do campo, será atribuída a variável
criada o conteúdo da variável NOME da primeira posição até a posição 16 (17-1), desta forma eliminamos o
texto 'xXx'. O nome é alterado de DANIEL R. WARDS xXx para DANIEL R. WARDS.
/* CRIA A TABELA */
DATA
TB_INDEX_EX2;
SET
TB_INDEX_EX1;
IF INDEX(NOME,'xXx') THEN
NOVO_NOME = SUBSTR(NOME,1,INDEX(NOME,'xXx')-1);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_INDEX_EX2;
RUN;
3 01/01/2014 333 DANIEL R. WARDS xXx DCJE 20000 17 SIM DANIEL R. WARDS
8 01/02/2014 333 DANIEL R. WARDS xXx DCJE 20000 17 SIM DANIEL R. WARDS
60
Obs DT_REF CDPASTA NOME AREA PROVISAO POSICAO VERDADEIRO NOVO_NOME
12 01/03/2014 333 DANIEL R. WARDS xXx DCJE 21050 17 SIM DANIEL R. WARDS
Sintaxe
%LET <nome macro variável> = <valor>
Exemplo:
Neste exemplo criamos à macro variável DT_REF e atribuímos a data SAS 01/09/2014. Atribuímos o valor a
variável DATA_REFERENCIA criada no data step, chamando através do & antes do nome da macro variável, ou
seja, &DT_REF.. OBS: Esta macro variável poderá ser utilizada em toda a extensão do seu código SAS.
/* MACRO VARIAVEL */
%LET DT_REF = '01SEP2014'D;
/* CRIA A TABELA */
DATA
TB_DATA_REFERENCIA;
SET
TB_COMPRESS_EX2;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_REFERENCIA;
RUN;
61
Obs DT_REF CDPASTA NOME AREA PROVISAO DATA_REFERENCIA
6 01/02/2014 223 NEIDE MAÇA DCRPF 1500 01/09/2014
7 01/02/2014 124 TALITA O9BJ ITCV 1200 01/09/2014
8 01/02/2014 333 DANIEL R. WARDS xXx DCJE 20000 01/09/2014
9 01/03/2014 222 JULYANA B. CHOCOLATE DCRPF 1650 01/09/2014
10 01/03/2014 123 BILLY BARROS ITCV 1950 01/09/2014
11 01/03/2014 124 TALITA O9BJ ITCV 1300 01/09/2014
12 01/03/2014 333 DANIEL R. WARDS xXx DCJE 21050 01/09/2014
13 01/03/2014 334 FABIANA PULGA BATISTA DCJE 250000 01/09/2014
Sintaxe
%SYSFUNC (função)
Exemplo:
Neste exemplo utilizamos a macro função %SYSFUNC para resolver a função DATE e a função INTNX na macro
variável DT_ATUAL e ULT_DIA_MES_ATUAL respectivamente. O dia atual é 21/10/2014 e passando esta data
para a função INTNX (macro variável ULT_DIA_MES_ATUAL) conseguimos obter o último dia do mês atual.
Quando informamos como primeiro critério “MONTH” significa que iremos movimentar o mês para frente ou
para trás, ao passar o parâmetro “0” significa que queremos o mês vigente da data informada, no caso Outubro
e ao passar o parâmetro “END” significa que queremos o último dia, ou seja, 31/10/2014.
/* CRIA TABELA */
DATA
TB_DATA_ULTIMO_DIA_MES (DROP = NOME_REMOVE_CARACTER);
SET
TB_COMPRESS_EX2;
ULTIMO_DIA_MES = &ULT_DIA_MES_ATUAL.;
FORMAT ULTIMO_DIA_MES DDMMYY10.;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_ULTIMO_DIA_MES;
RUN;
62
Obs DT_REF CDPASTA NOME AREA PROVISAO ULTIMO_DIA_MES
1 01/01/2014 123 BILLY BARROS ITCV 1000 31/10/2014
2 01/01/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 31/10/2014
3 01/01/2014 333 DANIEL R. WARDS xXx DCJE 20000 31/10/2014
4 01/02/2014 123 BILLY BARROS ITCV 1800 31/10/2014
5 01/02/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 31/10/2014
6 01/02/2014 223 NEIDE MAÇA DCRPF 1500 31/10/2014
7 01/02/2014 124 TALITA O9BJ ITCV 1200 31/10/2014
8 01/02/2014 333 DANIEL R. WARDS xXx DCJE 20000 31/10/2014
9 01/03/2014 222 JULYANA B. CHOCOLATE DCRPF 1650 31/10/2014
10 01/03/2014 123 BILLY BARROS ITCV 1950 31/10/2014
11 01/03/2014 124 TALITA O9BJ ITCV 1300 31/10/2014
12 01/03/2014 333 DANIEL R. WARDS xXx DCJE 21050 31/10/2014
13 01/03/2014 334 FABIANA PULGA BATISTA DCJE 250000 31/10/2014
Sintaxe
% EVAL (aritmético ou expressão lógica)
No exemplo abaixo criamos duas macro variáveis com os nomes: DIA_ATUAL e DIA_ANTERIOR. A macro variável
DIA_ATUAL recebe o valor referente à data do dia atual. Utilizamos à macro função %SYSFUNC para resolver a
data antes de utilizar a macro variável, se não utilizar a macro função %SYSFUNC, o date só será resolvido no
DATA SET impossibilitando calcular o valor para macro variável DIA_ANTERIOR. Após resolver e atribuir o valor
na macro variável DIA_ATUAL, utilizamos o valor para calcular o dia anterior e atribuir na macro variável
DIA_ANTERIOR, porém para efetuarmos cálculos em macro variáveis precisamos utilizar a macro função %EVAL,
caso contrário não conseguiremos realiza a operação.
/* MACRO VARIAVEIS */
%LET DIA_ATUAL = %SYSFUNC(DATE());
%LET DIA_ANTERIOR = %EVAL(&DIA_ATUAL-1);
/* CRIA TABELA */
DATA TB_DIAS;
HOJE = &DIA_ATUAL;
ONTEM = &DIA_ANTERIOR;
FORMAT
HOJE
ONTEM DDMMYY10.;
RUN;
63
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DIAS;
RUN;
1 24/04/2014 23/04/2014
Sintaxe
DATETIME ()
/* CRIA A TABELA */
DATA
TB_DATA_EX1;
SET
PROVISAO_AREAS_V1;
DATA_REF = DATETIME();
FORMAT DATA_REF DATETIME16.;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX1;
RUN;
64
Resultado do PROC PRINT:
Obs DT_REF CDPASTA NOME AREA PROVISAO DATA_REF
Sintaxe
DATE()
/* CRIA A TABELA */
DATA
TB_DATA_EX2;
SET
PROVISAO_AREAS_V1;
DATA_REF = DATE();
FORMAT DATA_REF DATE9.;
RUN;
65
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX2;
RUN;
Sintaxe
DAY(date)
No exemplo abaixo criamos o campo DIA_REF e atribuímos valor do dia a partir da data atual através da função
DATE.
/* CRIA A TABELA */
DATA
TB_DATA_EX3;
SET
PROVISAO_AREAS_V1;
DIA_REF = DAY(DATE());
RUN;
66
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX3;
RUN;
Sintaxe
MONTH(date)
No exemplo abaixo criamos o campo MES_REF e atribuímos valor do mês a partir da data atual informada
através da função DATE.
/* CRIA A TABELA */
DATA
TB_DATA_EX4;
SET
TB_DATA_EX3;
MES_REF = MONTH(DATE());
RUN;
67
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX4;
RUN;
Sintaxe
YEAR(date)
No exemplo abaixo criamos o campo ANO_REF e atribuímos o ano mês a partir da data atual informada através
da função DATE.
/* CRIA A TABELA */
DATA
TB_DATA_EX5;
SET
TB_DATA_EX4;
ANO_REF = YEAR(DATE());
RUN;
68
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX5;
RUN;
Sintaxe
MDY(mês, dia, ano)
/* CRIA A TABELA */
DATA
TB_DATA_EX6;
SET
TB_DATA_EX5;
/* CRIA A TABELA */
DATA
TB_DATA_EX7;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX7;
RUN;
70
Resultado do PROC PRINT:
Obs DATA_REF
1 01/04/2014
Sintaxe
DATEPART(data hora)
/* CRIA A TABELA */
DATA
TB_DATA_EX8;
SET
TB_DATA_EX1;
DATA_REF_TRATADA = DATEPART(DATA_REF);
FORMAT DATA_REF_TRATADA DDMMYY10.;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX8;
RUN;
71
Obs DT_REF CDPASTA NOME AREA PROVISAO DATA_REF DATA_REF_TRATADA
Sintaxe
INTNX(<intervalo>,<variavel>,<incremento>,<alinhamento>)
/* CRIA A TABELA */
DATA
TB_DATA_EX9;
SET
TB_DATA_EX8;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX9;
RUN;
72
Resultado do PROC PRINT:
Obs DT_REF CDPASTA NOME AREA PROVISAO DATA_REF DATA_REF_TRATADA DATA_INICIO_MES DATA_FIM_MES
1 01/01/2014 123 BILLY BARROS ITCV 1000 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
2 01/01/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
3 01/01/2014 333 DANIEL R. WARDS xXx DCJE 20000 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
4 01/02/2014 123 BILLY BARROS ITCV 1800 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
5 01/02/2014 222 JULYANA B. CHOCOLATE DCRPF 1500 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
6 01/02/2014 223 NEIDE MAÇÃ DCRPF 1500 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
7 01/02/2014 124 TALITA O9BJ ITCV 1200 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
8 01/02/2014 333 DANIEL R. WARDS xXx DCJE 20000 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
9 01/03/2014 222 JULYANA B. CHOCOLATE DCRPF 1650 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
10 01/03/2014 123 BILLY BARROS ITCV 1950 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
11 01/03/2014 124 TALITA O9BJ ITCV 1300 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
12 01/03/2014 333 DANIEL R. WARDS xXx DCJE 21050 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
13 01/03/2014 334 FABIANA PULGA BATISTA DCJE 250000 24APR14:14:59:36 24/04/2014 01/02/2013 31/03/2014
Sintaxe
INTCK(<interval>, <data inicial>, <data final>)
73
/* CRIA A TABELA */
DATA
TB_DATA_EX10 (DROP = DATA_REF NOME);
SET
TB_DATA_EX9;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX10;
RUN;
Obs DT_REF CDPASTA AREA PROVISAO DATA_REF_TRATADA DATA_INICIO_MES DATA_FIM_MES SEMESTRES MESES
74
Sintaxe
WEEKDAY (data)
/* CRIA A TABELA */
DATA
TB_DATA_EX11;
SET
TB_DATA_EX10;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_DATA_EX11;
RUN;
Obs DT_REF CDPASTA AREA PROVISAO DATA_REF_TRATADA DATA_INICIO_MES DATA_FIM_MES SEMESTRES MESES DIA_DA_SEMANA_FIM_MES
75
5.28 COMPRESS FUNCTION
Retorna uma cadeia de caracteres com caracteres especificados removidos da string original.
Sintaxe
COMPRESS(<texto original><caracteres a serem modificados><tipo de modificação>)
/* CRIA A TABELA */
DATA
TB_COMPRESS_EX1;
SET
PROVISAO_AREAS_V1;
NOME_SEM_ESPACO = COMPRESS(NOME);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_COMPRESS_EX1;
RUN;
Obs DT_REF CDPASTA NOME AREA PROVISAO NOME_SEM_ESPACO
76
Exemplo 2 : Remover letras minúsculas baseado no(s) caractere(s) e modificação passada para a função
No exemplo abaixo criamos o campo NOME_REMOVE_CARACTER e passamos à variável NOME como
argumento para a função COMPRESS. Neste caso passamos os argumentos “x” (minúsculo) como caracter a ser
modificado e o tipo de modificação “L” que é utilizado para remover as letras minúsculas, desta forma todos os
caracteres “x” em minúsculo serão removidos do texto.
/* CRIA A TABELA */
DATA
TB_COMPRESS_EX2;
SET
PROVISAO_AREAS_V1;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_COMPRESS_EX2;
RUN;
Exemplo 3 : Remover as letras minúsculas e maiúsculas baseado no(s) caractere(s) e modificação passada para a
função.
No exemplo abaixo criamos o campo NOME_REMOVE_CARACTER_TOTAL e passamos à variável NOME como
argumento para a função COMPRESS. Neste caso passamos os argumentos “LY” (maiúsculo) como caracteres a
seres modificados e o tipo de modificação “L” que é utilizado para remover as letras minúsculas, porém como
passamos o argumento em maiúscula todos os caracteres serão removidos do texto.
77
/* CRIA A TABELA */
DATA
TB_COMPRESS_EX3;
SET
PROVISAO_AREAS_V1;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_COMPRESS_EX3;
RUN;
13 01/03/2014 334 FABIANA PULGA BATISTA DCJE 250000 FABIANA PUGA BATISTA
Sintaxe
TRANWRD(<origem>, <destino>, <substituição>)
78
Exemplo:
No exemplo abaixo utilizamos a função TRANWRD para tratar uma variável de valor que recebemos em um
arquivo como texto sem perder nenhuma das casas decimais. O valor de entrada é '1114,11144654' em texto
e temos que transforma-lo para valor. O primeiro passo é descobrir quantas casas decimais temos para
posteriormente utilizar na divisão do número. Então vamos fazer o passo a passo:
Variável DIVISOR
DIVISOR = 10**((LENGTH(VALOR_ENTRADA_TXT)-1)-LENGTH(SCAN(VALOR_ENTRADA_TXT, "1", ',')));
DIVISOR = 10**((LENGTH(1114,11144654)-1)-LENGTH(SCAN(1114,11144654, "1", ',')));
DIVISOR = 10**((13-1)-LENGTH( 1114));
DIVISOR = 10**(12-4);
Divisior = 100.000.000;
Variável VALOR_ENTRADA_NUMERICO
VALOR_ENTRADA_NUMERICO = (COMPRESS(TRANWRD(1114,11144654, "," ,""))*1)/100.000.000;
VALOR_ENTRADA_NUMERICO = (COMPRESS(1114 11144654)*1)/100.000.000;
VALOR_ENTRADA_NUMERICO = (111411144654*1)/100.000.000;
VALOR_ENTRADA_NUMERICO = 111411144654/100.000.000;
VALOR_ENTRADA_NUMERICO = 1.114,11144654 ou 1.114,11 (Valor numérico)
/* TABELA */
DATA TB_VALOR_TRATADO;
VALOR_ENTRADA_TXT = '1114,11144654';
DIVISOR =10**((LENGTH(VALOR_ENTRADA_TXT)-1)-LENGTH(SCAN(VALOR_ENTRADA_TXT, "1", ',')));
VALOR_ENTRADA_NUMERICO =(COMPRESS(TRANWRD(VALOR_ENTRADA_TXT,",",""))*1)/DIVISOR;
FORMAT VALOR_ENTRADA_NUMERICO BESTD14.12;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_VALOR_TRATADO;
RUN;
79
5.30 TRIM FUNCTION
Retirar espaços entre as palavras.
Sintaxe
TRIM(expressão)
Exemplo:
No exemplo, criamos duas variáveis dentro do data set para identificar as diferenças quando utilizamos TRIM e
quando não utilizamos. Perceba que a variável criada NOME_E_AREA_SEM_TRIM não possui o comando TRIM e
o resultado é criado com espaços depois da variável NOME. Já a outra variável criada NOME_E_AREA, utilizando
o comando TRIM removeu os espaços entre as duas variáveis concatenadas e não removeu os demais espaços
como normalmente removemos utilizando o comando COMPRESS.
/* CRIA TABELA */
DATA
TB_CONCATENADO;
SET
PROVISAO_AREAS_V1;
NOME_E_AREA_SEM_TRIM = NOME!!"-"||AREA;
NOME_E_AREA = TRIM(NOME)!!"-"||TRIM(AREA);
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_CONCATENADO;
RUN;
80
5.31 SUM FUNCTION
Soma os elementos.
Sintaxe
SUM( matrix1<, matrix2,..., matrix15>)
Exemplo:
Neste exemplo criamos duas variável para realizar a subtração de dois números de maneiras diferentes. A
primeira variável é MOVIMENTACAO_INCORRETA, colocamos este número pois a subtração realizada sem a
utilização da função SUM não é realizada de forma correta quando um dos campos possui “.” como conteúdo
pois o SAS não consegue realizar a operação. Utilizando a função SUM na variável MOVIMENTACAO_CORRETA a
subtração é realizada corretamente, conforme tabela abaixo na observação 2.
/* CRIA TABELA */
DATA
PROVISAO_AREAS_V1_1;
INPUT
DT_REF DATE11.
CDPASTA
AREA $
PROVISAO
PROVISAO_ANTERIOR;
FORMAT
DT_REF DDMMYY10.;
CARDS;
01JAN2014 000000000123 ITCV 1000 0
01JAN2014 000000000222 DCRPF 1500 .
01JAN2014 000000000333 DCJE 20000 15000
;
RUN;
/* CRIA TABELA */
DATA
TB_MOVIMENTACAO;
SET
PROVISAO_AREAS_V1_1;
81
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA=TB_MOVIMENTACAO;
RUN;
É possível usar uma operação INNER JOIN em qualquer cláusula FROM. Esse é o tipo de associação mais comum.
Associações internas combinam registros de duas tabelas sempre que há valores correspondentes em um
campo comum para ambas as tabelas.
PROC SQL;
CREATE TABLE TB_CRUZA1 AS
SELECT
A.VA,
A.VB,
B.VC
FROM
UNI AS A
INNER JOIN
DUNI AS B
ON
A.VA = B.VA;
RUN;
82
PROC PRINT DATA = TB_CRUZA;
RUN;
RESULTADO
VA VB VC
5 D Y
5 D P
8 A Q
PROC SQL;
CREATE TABLE TB_CRUZA1 AS
SELECT
A.VA,
A.VB,
B.VC
FROM
UNI AS A
LEFT JOIN
DUNI AS B
ON
A.VA = B.VA;
RUN;
83
RESULTADO
VA VB VC
3 E
5 D Y
5 D P
7 F
8 A Q
PROC SQL;
CREATE TABLE TB_CRUZA2 AS
SELECT
A.VA,
A.VB,
B.VC
FROM
UNI AS A
FULL JOIN
DUNI AS B
ON
A.VA = B.VA;
RUN;
RESULTADO
VA VB VC
3 E
5 D Y
5 D P
7 F
8 A Q
9 W
84
6.5 RIGHT JOIN PROCEDURE
Use uma operação RIGHT JOIN para criar uma associação externa à direita (junção direita externa: uma
junção externa na qual todos os registros do lado direita da operação RIGHT JOIN da instrução SQL da consulta
são adicionados aos resultados da consulta, mesmo que não haja valores correspondentes no campo associado
da tabela à esquerda.). Associações externas à direita incluem todos os registros da segunda (direita) de duas
tabelas, mesmo quando não há valores coincidentes na primeira tabela (esquerda).
PROC SQL;
CREATE TABLE TB_CRUZA2 AS
SELECT
A.VA,
A.VB,
B.VC
FROM
UNI AS A
RIGHT JOIN
DUNI AS B
ON
A.VA = B.VA;
RUN;
RESULTADO
VA VB VC
9 W
5 D Y
5 D P
8 A Q
85
6.6 SELECT CASE PROCEDURE
Seleciona valores de resultados que satisfaçam as condições especificadas.
Exemplo 1: Criando novo campo e populando mediante as condições informadas no case, neste exemplo
utilizamos mais de uma variável no case
Neste exemplo criamos o campo QTDE_PAES e populamos a quantidade de acordo com a condição
especificada na ordem informada. Se o campo NOME estiver populado com 'BILLY BARROS' então a
quantidade de pães populada no campo QTDE_PAES será 5, se o campo NOME estiver populado com 'NEIDE
MAÇÃ' então a quantidade de pães populada no campo QTDE_PAES será 0, se o campo AREA estiver populado
com 'DCRPF' então a quantidade de pães populada no campo QTDE_PAES será 3, caso não seja nenhuma
destas condições a quantidade de pães populada no campo QTDE_PAES será 2.
/* CRIA TABELA*/
PROC SQL;
CREATE TABLE TB_QTDE_PAES AS
SELECT
NOME,
AREA,
CASE
WHEN NOME = 'BILLY BARROS' THEN '5'
WHEN NOME = 'NEIDE MAÇÃ' THEN '0'
WHEN AREA = 'DCRPF' THEN '3'
ELSE '2'
END AS QTDE_PAES
FROM
PROVISAO_AREAS_V1;
QUIT;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = TB_QTDE_PAES;
RUN;
86
NOME AREA QTDE_PAES
Exemplo 2: Criando novo campo e populando mediante as condições informadas no case, neste exemplo
utilizamos apenas uma variável no case.
Este exemplo é muito parecido com o exemplo anterior, a única mudança é que utilizamos apenas uma variável
a invés de duas e incluímos mais uma condição, quando o campo NOME estiver populado com 'JULYANA B.
CHOCOLATE' então a quantidade de pães populada no campo QTDE_PAES será 3.
/* CRIA TABELA*/
PROC SQL;
CREATE TABLE TB_QTDE_PAES_V1 AS
SELECT
NOME,
AREA,
CASE NOME
WHEN 'BILLY BARROS' THEN '5'
WHEN 'NEIDE MAÇÃ' THEN '0'
WHEN 'JULYANA B. CHOCOLATE' THEN '3'
ELSE 2
END AS QTDE_PAES
FROM
PROVISAO_AREAS_V1;
QUIT;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = TB_QTDE_PAES_V1;
RUN;
87
Resultado do PROC PRINT:
NOME AREA QTDE_PAES
Exemplo:
Neste exemplo criamos a tabela FILTRO_BASE_PROV_EX3 com base na tabela PROVISAO_AREAS_V1 mantendo
apenas os registros cujo valor de provisão estiver entre 1000 e 1500.
PROC SQL;
CREATE TABLE
FILTRO_BASE_PROV_EX3 AS
SELECT
TAB1.*
FROM
PROVISAO_AREAS_V1 AS TAB1
WHERE
PROVISAO BETWEEN 1000 AND 1500;
QUIT;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA= FILTRO_BASE_PROV_EX3;
RUN;
88
Obs DT_REF CDPASTA NOME AREA PROVISAO
7. ROUTINE
7.1 CALL SYMPUT ROUTINE
Atribui um valor produzido em uma etapa de dados a uma variável macro.
Sintaxe
CALL SYMPUT(macro variável , valor);
Exemplo:
Neste exemplo iremos criamos uma macro variável chamada “N” e populamos com o conteúdo da função
MOB(201301,201310) que é 9. O valor populado na macro variável “N” poderá ser utilizado em todo o código
SAS basta apenas chama-lá utilizando o &.
DATA _NULL_;
/* CALL SYMPUT = POPULA A VARIAVEL "N" COM O RESULTADO DO MOBDATA */
CALL SYMPUT("N",MOB(201301,201310));
RUN;
%PUT &N;
Resultado = 9
Sintaxe
CALL SLEEP(<n>, <Unidade >)
n = é uma constante numérica que especifica o número de unidades de tempo para o qual pretende suspender a
execução de um programa.
89
Unidade = especifica a unidade de tempo, tal como uma potência de 10, que é aplicado para n. Por exemplo, um
corresponde a um segundo, e 001 corresponde a um milésimo de segundo. Padrão: 0,001
Exemplo: A suspensão de execução com base em cálculo do tempo de sono
O exemplo a seguir diz ao SAS para suspender a execução do DATA até 22 de Abril de 2014, às 15:01. O SAS
calcula o comprimento da suspensão em função da data de destino com sua respectiva data e hora para
começar a executar.
DATA _NULL_;
SLEEPTIME='22APR2014:15:01'DT-DATETIME();
CALL SLEEP(SLEEPTIME,1);
RUN;
8. CRIANDO UM CONTADOR
Conta à quantidade de linhas de uma tabela.
Exemplo:
Neste exemplo criamos a tabela inicial PROVISAO_AREAS_CONT com a variável NOME_AREA criando uma nova
chave para tabela a partir de dois campos. Em seguida, utilizando o PROC CONTENTS ordenamos pela nova
chave e de forma descendente pelo valor da provisão mantendo o maior valor primeiro. Na tabela final
PROVISAO_AREAS_CONT_1 fazemos a contagem, ou seja, criamos uma variável chamada COUNT iniciando em 1
e somando +1 a cada vez que a chave NOME_AREA com conteúdo igual aparecer. Podemos utilizar para filtra os
maiores valores de um determinado tipo por exemplo.
/* ORDENA */
PROC SORT DATA = PROVISAO_AREAS_CONT;
BY NOME_AREA DESCENDING PROVISAO;
QUIT;
90
/* CRIA CONTADOR POR GRUPO "NOME_AREA" */
DATA
PROVISAO_AREAS_CONT_1;
SET
PROVISAO_AREAS_CONT;
BY
NOME_AREA;
IF FIRST.NOME_AREA THEN
COUNT=0;
COUNT+1;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA = PROVISAO_AREAS_CONT_1;
RUN;
9. ADD ABBREVIATION
É muito útil, podemos gravar códigos pré-prontos e utilizar a estrutura apenas digitando uma letra como atalho
e teclando enter.
91
Como fazer:
Monte a sua estrutura como por exemplo:
PROC SQL;
CREATE TABLE TABELA AS
SELECT
TAB1.*,
TAB2.*
FROM
TABELA_ORIGEM1 AS TAB1
LEFT JOIN
TABELA_ORIGEM2 AS TAB2
ON
A.VARIAVEL = B. VARIAVEL;
RUN;
Copie esta estrutura e vá em program > add abbreviation... > no campo Text to insert for abbreviation cole a
estrutura copiada. No campo abbreviation coloque por exemplo uma letra “S” e clique em “OK”.
No seu programa SAS digite “S” e tecle enter, pronto a sua estrutura inteira irá aparecer para você utilizar.
Passo a passo:
92
93
10. EXERCÍCIOS
/* CRIA TABELA */
10.1 Exercício
DATA 1
PROVISAO_AREAS_V0;
Importe as tabelas 1, 2 e 3 que estão em Excel, para o diretório do SAS WORK
INPUT
DT_REF DATE11.
CDPASTA
AREA $
PROVISAO
PROVISAO_ANTERIOR;
CARDS;
01JAN2014 000000000123 ITCV 1000 0
01JAN2014 000000000222 DCRPF 1500 .
01JAN2014 000000000333 DCJE 20000 15000
;
RUN;
/* VIZUALIZA O RESULTADO */
PROC PRINT DATA= PROVISAO_AREAS_V0;
RUN;
94
10.3 Exercício 3
Através da tabela TAB_CONTRATOS_001, crie uma tabela chamada TAB_CONTRATOS_002 trazendo todos os
campos da tabela TAB_CONTRATOS_001 e o subcanal da tabela SUBCAN para cada contrato, a partir da chave
EMPRESA + DICOM
Dica
95
10.4 Exercício 4
Através da tabela TAB_CONTRATOS_002, criada no exercício anterior, crie uma tabela chamada
TAB_CONTRATOS_003 trazendo todos os campos da tabela TAB_CONTRATOS_002 criando um campo chamado
TIPO_VARIAVEL, com as seguintes premissas:
96
10.5 Exercício 5
Através da tabela TAB_CONTRATOS_003, criada no exercício anterior, crie uma tabela chamada
TAB_CONTRATOS_004 trazendo todos os campos da tabela TAB_CONTRATOS_002 criando um campo chamado
EMP_DICOM, concatenando os campos DICOM E EMPRESA, com a função TRIM, para que o campo fique no
formato:
Ex.: 341 - 5
97
10.6 Exercício 6
Crie uma tabela chamada “Resultado” a partir da tabela abaixo chamada “Prov” mantendo apenas a área “DCJE”
e com data de referencia (DT_REF) menor ou igual a 01/03/2014.
98
10.7 Exercício 7
Crie duas tabelas, um chamada RESULTADO_1 e outra RESULTADO_2 a partir da tabela PROV. A primeira
chamada RESULTADO_1 mantendo apenas a área DCJE e mantendo também apenas a data de referencia
(DT_REF) menor ou igual a 01/03/2014. A segunda chamada RESULTADO_2 mantendo apenas a área ITCV e
mantendo também apenas a data de referencia (DT_REF) menor ou igual a 01/02/2014, porém, faça isso
criando as tabelas dentro de uma macro rotina. Depois faça uma duas chamadas de macro, uma para cada
tabela a ser criada.
TABELA PROV
11. ANOTAÇÕES
99
100
12. BIBLIOGRAFIA
http://pt.wikipedia.org/wiki/SAS_(inform%C3%A1tica)
http://www.sas.com/offices/latinamerica/brazil/institucional.html
https://onlinecourses.science.psu.edu/stat481/node/44
https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000245852.htm
https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000293668.htm
http://support.sas.com/resources/papers/proceedings09/060-2009.pdf
http://www.ats.ucla.edu/stat/sas/library/changing_shape.pdf
http://support.sas.com/kb/33/228.html
http://support.sas.com/resources/papers/proceedings09/060-2009.pdf
http://www.psych.yorku.ca/lab/sas/macro.htm
http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a000208971.htm
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002058232.htm
http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a002975331.htm
101