Tutorial: Proc Sql (SAS)

Como já disse algumas vezes aqui, o SQL é uma linguagem própria para trabalhar com bases de dados. Logo, é de se esperar que alguns softwares utilizem funções semelhantes, ou até iguais, a ela. Isso porque (i) muitas pessoas que utilizam base de dados já estão acostumadas com o SQL, e (ii) é muito mais fácil se basear nessas funções já existentes do que ficar tentando criar algo novo mirabolante. O SAS, assim como outros softwares estatísticos, incluiu o SQL no seu ambiente. Para utilizá-lo, o usuário precisa somente iniciar a sintaxe com PROC SQL e finalizar com QUIT (ou RUN). Aqui, veremos vários exemplos de como o PROC SQL pode fazer muito pelo usuário.

Comecemos montando uma tabela exemplo. Façamos de conta que você tem uma tabela com as informações das compras feitas pelos clientes de diversas lojas que sua empresa possui pelo Brasil. Na tabela, você encontrará a coluna ID contendo a chave de identificação do indivíduo, UF contendo a unidade federativa do indivíduo e VLR_COMPRA contendo o valor da compra feita pelo indivíduo.

DATA EXEMPLO;
INPUT ID $ UF $ VLR_COMPRA;

CARDS;
AA123 SP 1000
BB001 MG 1500
AA010 BA 1650
AA003 BA 1900
. SP 1520
. PE 1575
. . 1000
AA111 PE 500
;
RUN;

Note que temos alguns valores missing. Isso é proposital e você saberá como lidar com eles ao fim desse tutorial.

Agora, vamos ver as principais sub-cláusulas do PROC SQL:

PROC SQL;
SELECT COLUMN(S)
FROM TABLE(S) | VIEW(S)
WHERE EXPRESSION
GROUP BY COLUMN(S)
ORDER BY COLUMN(S);
QUIT;

Começando pelo mais simples, o SELECT serve para selecionar as colunas que você deseja trazer da tabela referenciada. No exemplo abaixo, vamos trazer as informações de ID e UF da tabela EXEMPLO:

PROC SQL;
SELECT ID, UF
FROM EXEMPLO ;
QUIT;

Agora, se você quiser trazer todas as colunas, utilize o asterisco:

PROC SQL;
SELECT *
FROM EXEMPLO ;
QUIT;

Nos exemplos acima, você está selecionando as informações, mas elas não estão sendo salvas em uma nova tabela que poderá ser utilizada no futuro. Caso você queira criar uma nova tabela com essas informações, use o CREATE TABLE + NOME DA TABELA CRIADA + AS. No exemplo abaixo, estamos criando uma nova tabela chamada EXEMPLO_2 contendo as informações de ID e UF dos clientes da tabela EXEMPLO:

PROC SQL;
CREATE TABLE EXEMPLO_2 AS
SELECT ID, UF 
FROM EXEMPLO;
QUIT;

Agora a tabela está salva em sua WORK e pode ser usada em outros passos do seu programa. Aqui, continuaremos trabalhando com a tabela EXEMPLO.

Para filtrar de acordo com algum critério definido pelo usuário, basta utilizar o WHERE. Se quisermos selecionar somente os clientes em que a UF é SP, basta inserir WHERE = “SP”. Isso porque UF é um campo texto, caso não o fosse, não utilizaríamos as aspas:

PROC SQL;
SELECT ID
       , UF
FROM EXEMPLO
WHERE UF = "SP";
QUIT;

Se você trabalhar com variáveis numéricas, você pode utilizar, além do igual, os símbolos de maior (>), menor (<), maior ou igual (>=) ou menor ou igual (<=).

Você pode filtrar utilizando como critério uma variável não selecionada:

PROC SQL;
SELECT ID, UF
FROM EXEMPLO
WHERE VLR_COMPRA > 1500;
QUIT;

É comum nós utilizarmos informações geradas por outras áreas. Ou fornecermos insumos para outras pessoas. Sendo assim, nem sempre o nome da variável é suficiente. Até porque é uma boa prática utilizar abreviações nos nomes. Uma opção para facilitar a identificação é utilizar o LABEL, criando assim um rótulo para a variável. Sempre que você passar o mouse por cima da coluna, ou quando gerar as informações da tabela com o PROC CONTENTS, irá aparecer explicação sobre a variável:

PROC SQL;
CREATE TABLE EXEMPLO_LABEL AS
SELECT ID LABEL = "CHAVE DE IDENTIFICACAO"
       , UF LABEL = "UNIDADE FEDERATIVA"
FROM EXEMPLO
WHERE UF = "SP";
QUIT;

PROC CONTENTS DATA = EXEMPLO_LABEL; RUN;

Se quiser renomear a variável, ao selecioná-la, utilize o AS:

PROC SQL;
SELECT ID
       , UF
       , VLR_COMPRA AS VALOR
FROM EXEMPLO
QUIT;

Você pode criar uma nova variável ao selecionar as já existentes. No exemplo abaixo, criamos uma variável que representa o valor da compra com 10% de desconto – i.e., 90% do valor da compra:

PROC SQL;
CREATE TABLE EXEMPLO_NOVA_VARIAVEL AS
SELECT ID
       , UF
       , 0.9*VLR_COMPRA AS VALOR_C_DESC LABEL = "VALOR DA COMPRA COM          10% DE DESCONTO"
FROM EXEMPLO
WHERE UF = "SP";
QUIT;

Para criar campos totalizadores (agrupados) você pode usar funções como SUM na hora de selecionar as variáveis. No exemplo abaixo, contamos o número de ids, a soma dos valores de compra e o maior valor de compra agrupando por UF:

PROC SQL;
SELECT UF
       , SUM(VLR_COMPRA) AS VALOR_TOTAL
       , MAX(VLR_COMPRA) AS VALOR_MAX
       , COUNT(ID) AS QTD_ID
FROM EXEMPLO
GROUP BY UF;
QUIT;

Agora, imagine que você tenha dezenas de variáveis e queira selecionar todas, com exceção de três delas. Utilizar o SELECT seria muito trabalhoso, pois você teria que listar todas as variáveis que deseja trazer. O ideal seria somente retirar as três que não te interessa. Isso é simples de fazer, basta utilizar o DROP após o nome da tabela criada. No exemplo abaixo, trazemos todas as variáveis da tabela EXEMPLO com exceção da UF:

PROC SQL;
CREATE TABLE EXEMPLO_3 (DROP = UF) As
SELECT * FROM EXEMPLO;
Quit;

Como já foi falado, temos muitas variáveis missing. Como se livrar delas?

Agora entra em cena o IS NULL e o IS NOT NULL. O nome é intuitivo, enquanto o primeiro traz as informações missing, o segundo trás o que é não missing. Por exemplo, podemos trazer as informações da tabela, desde que o ID não seja missing:

PROC SQL;
SELECT  *  FROM EXEMPLO
WHERE ID IS NOT NULL;
Quit;

Podemos trazer também a informação quando o ID é missing:

PROC SQL;
SELECT  *  FROM EXEMPLO
WHERE ID IS NULL;
Quit;

Agora você está pronto para fazer várias tratativas nas suas tabelas.

Leia também os posts:

Combinando três tabelas com o left join
Como combinar tabelas no SAS utilizando left join e full join
Conversão texto para número no data step e proc sql

4 comentários em “Tutorial: Proc Sql (SAS)”

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *