Vous êtes sur la page 1sur 47

UNIVERSIDADE FEDERAL DE SÃO CARLOS 

CENTRO DE CIÊNCIAS EXATAS E DE TECNOLOGIA 
DEPARTAMENTO DE ESTATÍSTICA 
 
 
 
 
 
 
 
 
 
 

INTRODUÇÃO AO SAS­SQL 
 
 
 

FELIPE MARANGONI 
PEDRO FERREIRA FILHO 
 
 
 
 
 
 
 
 
 

JANEIRO 2010 
 

 
 
1. Introdução 
 
  Structure Query Language ou SQL é uma sublinguagem que nos possibilita trabalhar e 
relacionar  grandes  bases  de  dados  de  forma  simples,  rápida  e  flexível.  Devido  às  grandes 
vantagens  em  utilizá‐la,  diversas  companhias  como  IBM,  Microsoft,  Sybase  ou  Oracle  a 
adotaram em seus produtos. 
  Este manual  utilizará o SAS – Statistical Analisys  System, um  software estatístico que 
também trabalha com este tipo de linguagem através do procedimento PROC SQL. 
 
1.1 Porquê  aprender PROC SQL 
 
  Diferentemente das linguagens procedurais, SQL é uma linguagem declarativa, ou seja, 
uma consulta SQL especifica a forma do resultado e não o caminho para se chegar a ele. Desta 
maneira, a simples utilização do PROC SQL ao invés do SAS Data steps (Ambiente Natural do 
SAS) eliminará diversos passos e procedimentos em seu programa. 
  Alem  disso,  também  disponibiliza  Procedures  para  criar,  modificar,  relacionar  ou 
eliminar bancos, produzir relatórios ou mesmo permitir uma maior segurança das informações 
presentes nos Data Sets. 
 
2. Criando Uma Biblioteca Pessoal 
 
  Primeiramente, utilizando o SAS Data step, criaremos uma Biblioteca  em um diretório 
especificado  pelo  programador,  onde  armazenaremos  todos  os  bancos  de  dados  e  arquivos 
referentes ao mesmos. Criar uma biblioteca significa especificar um local de armazenamento 
qualquer no computador do usuário, onde todos os bancos de dados ficarão salvos e poderão 
ser acessados através do SAS. 
  No  exemplo  a  seguir,  criamos  uma  biblioteca  chamada  DADOS,  em  que  todos  os 
arquivos nela salvos, serão armazenados na área de trabalho do programador. 

 
SAS DATA STEP 
 
LIBNAME DADOS 'C:\Felipe Marangoni\Desktop\SQL - Arquivos';
RUN;
 
  Por  default,  o  SAS  já  disponibiliza  uma  biblioteca  chamada  WORK,  porem  qualquer 
banco  de  dados  armazenados  nela  será  temporário  e  será  apagado  ao  encerrarmos  a 
respectiva sessão SAS. Podemos visualizar a criação da biblioteca DADOS dentro do diretório 
Libraries. 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 1 
 
 

                       
 
3. Trabalhando com um conjunto de dados 
 
  Para as diversas funções do PROC SQL, utilizaremos um banco de dados referente ao 
processo seletivo 2008 da UFSCar. 
 
Data Sets: 
 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  As diversas funções disponibilizadas no SQL encontram‐se em palavras reservadas de 
programação. 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 2 
 
 
 
 
 
3.1 Ordenando OUTPUT de acordo com uma Variável 
 
  Podemos então, verificar o conteúdo lido de qualaquer uma das Tabelas: 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT INSCRICAO,
SEXO,
CAMPUS
FROM DADOS.GERAL
ORDER BY INSCRICAO;
QUIT; 
 
  É possível validar esta operação através dos comandos VALIDATE ou NOEXEC, usados 
apenas  para  conferir  se  a  sintaxe  encontra‐se  correta  sem  que  o  todo  o  procedimento  seja 
executado. 
 
CÓDIGO SQL 
 
PROC SQL;
VALIDATE
SELECT INSCRICAO,
SEXO,
CAMPUS
FROM DADOS.GERAL
ORDER BY INSCRICAO;
QUIT;
 
CÓDIGO SQL 
 
PROC SQL NOEXEC;
SELECT INSCRICAO,
SEXO,
CAMPUS
FROM DADOS.GERAL
ORDER BY INSCRICAO;
QUIT;
 
OUTPUT PARCIAL 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 3 
 
 
Verificamos  que  o  resultado  é  apresentado  de  forma  ordenada  por  número  de 
inscrição, e com apenas as variáveis especificadas. Podemos ainda ordenar a tabela através da 
posição  ordinal  em  que  a  variável  se  encontra  dentro  do  SELECT.  Se  for  mantida    a  variável 
Inscricao  na  primeira  posição,  obteremos  o  mesmo  resultado  ao  utilizarmos  o  valor  1,  como 
vemos a seguir.  
 
CÓDIGO SQL 
 
PROC SQL;
SELECT INSCRICAO,
SEXO,
CAMPUS
FROM DADOS.GERAL
ORDER BY 1;
QUIT; 
 
OUTPUT PARCIAL 

 
3.2 Agrupando OUTPUT de acordo com uma Variável 
 
  Podemos  agrupar  o  banco  de  dados  de  acordo  com  alguma  variável  de  interesse. 
Como exemplos, utilizaremos a variável Cidade, em GERAL. 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 4 
 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT INSCRICAO,
ISENTO,
CIDADE
FROM DADOS.GERAL
GROUP BY CIDADE;
QUIT;
 
OUTPUT PARCIAL 

 
  É  possível  verificar  que  os  indivíduos  encontram‐se  distribuídos  de  acordo  com  as 
cidades de origem. 
 
3.3 Utilizando Operações com Escalares 
 
  Os operadores escalares disponíveis são: 
 

 
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 5 
 
 
  Considerando que o total de pontos possíveis é 190, podemos criar uma nova variável 
chamada  Aproveitamento  através  da  multiplicação  de  TPontos  por  100/190  (em  valores 
percentuais). 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT INSCRICAO,
TPONTOS,
TPONTOS*(100/190) AS APROVEITAMENTO
FROM DADOS.GERAL;
QUIT; 
 
OUTPUT PARCIAL 

 
  Alem  disso,  é  possível  refinar  a  busca  utilizando  a  ordenação  e  o  agrupamento  em 
conjunto. 
 
3.4 Voltando ao Ambiente Natural SAS 
 
  No  exemplo  acima,  criamos  uma  nova  variável  cujo  conteúdo  não  existia 
anteriormente. Caso haja  interesse, é possível voltar a trabalhar com esta variável utilizando 
SAS Data step. 
 
3.4.1 ODS LISTING 
 
A partir do comando ODS do PROC SQL, será obtido um novo banco que chamaremos de 
APTOTAL, armazenado na biblioteca WORK do SAS. 
 
CÓDIGO SQL 
 
ODS LISTING CLOSE;
ODS OUTPUT SQL_Results = APTOTAL;
PROC SQL;
SELECT INSCRICAO,
TPONTOS*(100/190) AS APROVEITAMENTO
FROM DADOS.GERAL;
QUIT;

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 6 
 
ODS OUTPUT CLOSE;
ODS LISTING;
 
WORK.APTOTAL 
 

 
 
  Como  não  especificamos  a  biblioteca,  por  default  o  arquivo  ficará  gravado  na 
biblioteca temporária Work do SAS. 
 
3.7.4 Modificando Tabelas e Variáveis 
 
  No  exemplo  abaixo,  verificamos  que  é  possível  modificar  características  de  uma 
variável como o formato, tipo, descrição, dentre outras opções. 

 
CÓDIGO SQL 
 
PROC SQL;
ALTER TABLE DADOS.SEXO
MODIFY SX CHAR(1) LABEL='Descricao';
QUIT;
 
 
DADOS.SEXO 

 
  Verifica‐se  que  existem  diversos  operadores  e  funções  que  nos  auxiliam  a  trabalhar 
com um banco de dados. Na tabela abaixo, podemos visualizar todos eles. 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 7 
 
 
 
3.4.2 Criando uma tabela através do comando CREATE TABLE 
 
  Podemos voltar também ao ambiente natural SAS através do comando CREATE TABLE 
de  uma  forma  ainda  mais  simplificada.  Verificaremos  que  o  resultado  será  idêntico  ao  do 
exemplo anterior. 
 
CÓDIGO SQL 
 
PROC SQL;
CREATE TABLE APTOTAL2 AS
SELECT INSCRICAO,
TPONTOS*(100/190) AS APROVEITAMENTO
FROM DADOS.GERAL;
QUIT;
 
WORK.APTOTAL2 
 

 
 
3.5 Inserindo Novas Observações 
 
  Existem  alguns  comandos  que  permitem  que  novas  linhas  ou  observações  sejam 
inseridas no banco de dados de forma manual. 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 8 
 
3.5.1 Função INSERT através do comando SET 
 
  Através  da  função  INSERT  é  possivel  inserir  observações  manualmente  através  da 
digitação  dos  dados.  Deve‐se  ressaltar  que  esta  é  uma  forma  indicada  para  a  inclusão  de 
apenas poucas observações. 
 
 CÓDIGO SQL 
 
PROC SQL;
INSERT INTO DADOS.CAMPUS
SET CAMPUS = 4,
CC = 'Campinas';
QUIT;
 
3.5.2 Função INSERT através do comando VALUES 
 
  É  possível  também  inserir  diretamente  toda  uma  linha  através  da  função  VALUES, 
como visto no exemplo a seguir. 

 
CÓDIGO SQL 
 
PROC SQL;
INSERT INTO DADOS.CAMPUS
VALUES (5,'Araraquara');
QUIT; 
 
3.6 Removendo Linhas 
 
  O comando DELETE possibilita a remoção de uma ou mais linhas de uma determinada 
tabela.  Para  a  seleção  das  linhas  a  serem  deletadas,  pode‐se  trabalhar  conjuntamente  com 
operadores lógicos dentro da função WHERE. 

 
CÓDIGO SQL 
 
PROC SQL;
DELETE FROM DADOS.CAMPUS
WHERE CAMPUS GE 4;
QUIT; 
 
3.7Alterando Colunas através do comando ALTER TABLE 
 
  Através  do  comando  ALTER  TABLE,  é  possível  alterar  uma  tabela,  modificando, 
adicionando ou transformando variáveis. 

 
3.7.1 Adicionando uma nova variável 
 
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 9 
 
CÓDIGO SQL 
 
PROC SQL;
ALTER TABLE DADOS.CAMPUS
ADD CODIGO CHAR(2);
QUIT;
 
DADOS.CAMPUS 
 

 
 
 
3.7.2 Trabalhando com os recursos conjuntamente 
 
  Dentro de um único procedure, podemos trabalhar com diversos operadores de forma 
seqüencial.  No  exemplo  a  seguir,  observa‐se  que  são  executadas  diversas  funções  dentro  de 
um único PROC SQL. 

 
CÓDIGO SQL 
 
PROC SQL;
ALTER TABLE DADOS.GERAL
ADD APTOTAL NUM
MODIFY TPONTOS FORMAT=INT8.2,
APTOTAL FORMAT=PERCENT8.2;
UPDATE DADOS.GERAL
SET APTOTAL = TPONTOS/190;
SELECT INSCRICAO,
TPONTOS,
APTOTAL
FROM DADOS.GERAL;
QUIT;
 
OUTPUT 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 10 
 
 
3.7.3 Excluindo Variáveis ou Tabelas 
 
CÓDIGO SQL 
 
PROC SQL;
ALTER TABLE DADOS.CAMPUS
DROP CODIGO;
QUIT; 
 
 
4. Verificando o Conteúdo de um Banco    
 
CÓDIGO SQL 
 
PROC SQL;
DESCRIBE TABLE DADOS.GERAL;
RUN; 
 
LOG 
 

  
 
4.1 Identificando Dados Duplicados 
 
  Em um conjunto de dados como este, que possui mais de 26 mil observações, é de se 
esperar que existam colunas com informações iguais. A partir do comando DISTINCT, é possível 
selecionar cada uma das informações, sem necessidade de repeti‐las, tendo uma visão geral do 
conteúdo de uma específica variável. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT DISTINCT OP1
FROM DADOS.GERAL;
QUIT;

OUTPUT PARCIAL 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 11 
 
 
4.2 Identificando dados únicos 
 
  Outra possibilidade é a de encontrar valores que não se repetem no  Data Set, o que 
muitas vezes é de grande utilidade para o programador, como veremos a seguir. 
 
CÓDIGO SQL: 
 
PROC SQL;
SELECT UNIQUE CIDADE
FROM DADOS.GERAL;
QUIT; 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
OUTPUT PARCIAL 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 12 
 
 
 
 
  Neste caso, o comando UNIQUE permite ao programador identificar variações de uma 
mesma cidade, ou mesmo erros de digitação, podendo assim fazer as devidas modificações. 

 
5. Operadores Lógicos e Funções 
   
Podemos  utilizar  operadores  e  funções  para  definir  dados  específicos  de  um  banco  ou 
relacionar tabelas a partir de uma variável em comum. 
 

 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT DISTINCT OP1
FROM DADOS.GERAL
WHERE OP1 >= 137 and op1 <= 151;
QUIT;
 
 
 
 
 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 13 
 
 
OUTPUT 
 

 
CÓDIGO SQL 
PROC SQL;
SELECT INSCRICAO,
CIDADE,
SEXO,
TPONTOS
FROM DADOS.GERAL
WHERE SEXO EQ 2 AND
(TPONTOS GE 155 AND TPONTOS LE 160)
GROUP BY CIDADE;
QUIT;
 
OUTPUT 
 

 
 
6. Trabalhando com Duas ou Mais Bases 
 
Não  é  difícil  nos  depararmos  com  uma  situação  em  que  as  informações  desejadas 
encontram‐se  espalhadas  por  diferentes  bases  de  dados.  Uma  questão  muito  comum  é  a 
necessidade de se trabalhar e interagir com todos estes data sets simultaneamente. A seguir, 
caminharemos por diferentes bancos de dados de uma forma simplificada, utilizando algumas 
das funções já vistas inicialmente. 
Neste  primeiro  caso,  repetiremos  o  exemplo  acima,  trabalhando  com  o  banco  Geral  e 
buscando  no  banco  Sexo,  a  variável  SX  que  corresponde  ao  formato  da  variável  SEXO.  Vale 
destacar  que  é  necessário  existir  uma  variável  em  comum  em  ambos  os  data  sets  que 
diferencie as informações (foreign key) que neste caso será SEXO. 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 14 
 
CÓDIGO SQL 
 
ODS LISTING CLOSE;
ODS OUTPUT SQL_Results = NOVODATA;
PROC SQL;
SELECT GERAL.INSCRICAO,
GERAL.CIDADE,
SEXO.SX,
GERAL.TPONTOS
FROM DADOS.GERAL, DADOS.SEXO
WHERE GERAL.SEXO = SEXO.SEXO;
QUIT;
ODS OUTPUT CLOSE;
ODS LISTING;
 
OUTPUT 
 

 
 
  Podemos observar que neste novo banco “NOVODATA” conterá as duas informações 
conjuntamente, que até então estavam separadas. Ao se trabalhar com ambos os data sets, se 
obtêm  uma  saída  muito  mais  informativa,  já  que  o  código  relativo  a  variável  em  questão  é 
substituído pelo seu respectivo formato. 
  Desta forma, podemos ter uma grande diversidade de aplicações: 
 
CÓDIGO SQL 
 
  PROC SQL;
SELECT GERAL.INSCRICAO,
GERAL.SEXO,
GERAL.CAMPUS,
GERAL.OP1
FROM DADOS.GERAL, DADOS.SEXO, DADOS.CAMPUS, DADOS.CURSO
WHERE GERAL.SEXO = SEXO.SEXO;
QUIT;
 
OUTPUT PARCIAL 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 15 
 
 
 
CÓDIGO SQL 
 
  PROC SQL;
SELECT GERAL.INSCRICAO,
GERAL.OP1,
CURSO.NOME_CURSO,
ISENCAO.SN
FROM DADOS.GERAL, DADOS.CURSO, DADOS.ISENCAO
WHERE GERAL.OP1 >= 137 and GERAL.OP1 <= 151 AND
GERAL.OP1 = CURSO.OP1 AND
GERAL.ISENTO = ISENCAO.ISENTO
ORDER BY GERAL.OP1;
QUIT;
 
OUTPUT PARCIAL 

 
 
2.8.2 Combinando bancos 
 
  Existem  diversas  opções  para  junções  de  dois  ou  mais  bancos  de  dados.  A  seguir 
veremos algumas possibilidades de concatenações de forma bem simplificada. 
 
2.8.2.1 Concatenando utilizando a função LEFT 
 
  Ao  utilizarmos  a  opção  LEFT,  ao  unirmos  duas  tabelas,  àquela  que  dispormos  à 
esquerda, logo após o comando FROM, será completamente selecionada. No caso da tabela à 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 16 
 
direita, apenas as observações ligadas pela variável chave comum em ambas as tabelas é que 
serão selecionadas.  
 

   
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB1 LEFT JOIN DADOS.TAB2
ON TAB1.X = TAB2.X;
QUIT;
 
OUTPUT 

 
 
 
 
2.8.2.2 Concatenando utilizando a função RIGHT 
 
  Da  mesma  forma  que  no  exemplo  anterior,  ao  utilizarmos  o  comando  RIGHT,  o 
resultado será parecido, porem com a tabela que estava do lado direto, logo após o comando 
FROM. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB1 RIGHT JOIN DADOS.TAB2
ON TAB1.X = TAB2.X;
QUIT;
 
OUTPUT 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 17 
 
 
2.8.2.3 Concatenando utilizando a função FULL 
 
  Ao utilizarmos a função FULL, todas as observações serão selecionadas e dispostas de 
forma a manter a igualdade da variável chave. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB1 FULL JOIN DADOS.TAB2
ON TAB1.X = TAB2.X;
QUIT;
 
OUTPUT 

 
2.8.2.3 Concatenando utilizando a função COALESCE 
 
  Podemos ainda conseguir o mesmo resultado do exemplo anterior, aplicando a função 
COALESCE, excluindo a variável X que aparece duas vezes. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT COALESCE(TAB1.X,TAB2.X), A, B
FROM DADOS.TAB1 FULL JOIN DADOS.TAB2
ON TAB1.X = TAB2.X;
QUIT;
 
OUTPUT 

 
 
2.8.2.3 Junção de Tabelas através do operador EXCEPT 
 
  Através  do  operador  EXCEPT,  serão  selecionadas  as  observações  únicas  da  primeira 
tabela,  ou  seja,  que  estejam  presente  na  primeira  tabela  e  não  estejam  na  segunda.  Para 
exemplificação, passaremos a trabalhar com novas tabelas. 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 18 
 
     
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB3
EXCEPT
SELECT *
FROM DADOS.TAB4;
QUIT;
 
OUTPUT 

 
 
Caso utilizemos EXCEPT ALL, observações repetidas no primeiro banco e que não estejam 
contidas no segundo, serão preservadas. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB3
EXCEPT ALL
SELECT *
FROM DADOS.TAB4;
QUIT;
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 19 
 
OUTPUT 

 
Se utilizarmos ainda a função CORR, todas as observações repetidas e uma mesma variável 
e em ambos os bancos serão excluídas, sejam elas acompanhadas de informações diferentes 
de outras variáveis ou não. Desta maneira, apenas serão mantidas as observações realmente 
únicas no primeiro banco. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB3
EXCEPT CORR
SELECT *
FROM DADOS.TAB4;
QUIT;
 
OUTPUT 

 
2.8.2.4 Junção de Tabelas através do operador INTERSECT 
 
O  operador  INTERSECT  permite  que  selecionemos  linhas  que  pertençam  em  ambas  as 
tabelas. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB3
INTERSECT
SELECT *
FROM DADOS.TAB4;
QUIT;
 
OUTPUT 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 20 
 
 
 
Assim como no primeiro caso, as opções ALL e CORR também poderão ser utilizadas. 
 
2.8.2.5 Junção de Tabelas através do operador UNION 
 
O  operador  UNION  fará  a  junção  completa  das  tabelas,  excluindo  apenas  as  linhas 
duplicadas. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB3
UNION
SELECT *
FROM DADOS.TAB4;
QUIT;
 
OUTPUT 

 
 
2.8.2.5 Junção de Tabelas através do operador OUTER UNION 
 
O  operador  OUTER  UNION  concatenará  as  duas  tabelas,  uma  abaixo  da  outra,  sem  que 
nenhuma  linha  seja  excluída.  Utilizando  a  opção  CORR,  verifica‐se  a  união  da  variável  em 
comum. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB3
OUTER UNION
SELECT *
FROM DADOS.TAB4;
QUIT;
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 21 
 
OUTPUT 

 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.TAB3
OUTER UNION CORR
SELECT *
FROM DADOS.TAB4;
QUIT;
 
OUTPUT 

 
2.9 Utilizando referencia em um mesmo SELECT 
 
Criando uma nova coluna com referência a outra calculada em um mesmo SELECT. 

CÓDIGO SQL 
 
PROC SQL;
SELECT INSCRICAO,
TPONTOS,
CIDADE,
TPONTOS/190 AS APROVEITAMENTO,
CALCULATED APROVEITAMENTO*100 AS PORCENTAGEM
format=inter8.2
FROM DADOS.GERAL
ORDER PORCENTAGEM DESC;
QUIT;
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 22 
 
OUTPUT PARCIAL 

 
 
É ainda possível, colocar na forma de porcentagem diretamente, excluindo uma linha de 
programação e otimizando o processo. 

CÓDIGO SQL 
 
PROC SQL;
SELECT INSCRICAO,
TPONTOS,
CIDADE,
TPONTOS/190 AS APROVEITAMENTO
format=percent8.2
FROM DADOS.GERAL
ORDER BY APROVEITAMENTO DESC;
QUIT;
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 23 
 
OUTPUT PARCIAL 

 
 
2.10 Identificando Não‐Missing 
 
CÓDIGO SQL 
 
  PROC SQL;
SELECT INSCRICAO,
TPONTOS,
COALESCE(ISENTO)
FROM DADOS.GERAL;
QUIT;

OUTPUT 
 
2.11 Inserindo uma coluna de referência 
 
  Através  da  função  MONOTONIC(  )  é  possível  adicionar  uma  coluna  ao  OUTPUT  que 
contenha uma seqüência ordenada, como referência à posição das observações nas linhas. 
 
CÓDIGO SQL 
   
  PROC SQL;
SELECT MONOTONIC() AS Numero_Linha,
GERAL.INSCRICAO,
CAMPUS.CC
FROM DADOS.GERAL, DADOS.CAMPUS
WHERE GERAL.CAMPUS = CAMPUS.CAMPUS;
QUIT;

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 24 
 
OUTPUT PARCIAL 

 
  Existe  ainda  a  possibilidade  de  se  acrescentar  esta  coluna  através  do  comando 
NUMBER, como vemos a seguir. 
 
CÓDIGO SQL 
   
  PROC SQL NUMBER;
SELECT GERAL.INSCRICAO,
CAMPUS.CC
FROM DADOS.GERAL, DADOS.CAMPUS
WHERE GERAL.CAMPUS = CAMPUS.CAMPUS;
QUIT;
 
OUTPUT PARCIAL 

 
2.12 Estatísticas Descritivas no SQL 
 
  O  procedure  SQL  é  também  uma  ferramenta  excelente  para  a  criação  de  bancos  de 
dados  que  contenha  informações  descritivas  de  outros  data  sets.  Isto  é  possível  através  de 
uma gama de funções disponíveis que permitem cálculos, estatísticas descritivas e resumos em 
geral. 
  Na tabela a seguir é possível visualizar essas funções. 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 25 
 
 
 
  Podemos  então  obter  o  número  de  cursos  disponíveis  através  da  função  COUNT 
aplicado à variável Nome_Curso ou OP1. 
 
CÓDIGO SQL 
 
  PROC SQL;
SELECT COUNT(NOME_CURSO) AS Numero_de_Cursos
FROM DADOS.CURSO;
QUIT;
 
OUTPUT 

 
 
  Podemos ainda trabalhar conjuntamente as estatísticas descritivas e as funções acima 
exemplificadas. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT MAX(TPONTOS) AS Melhor_Desempenho,
MIN(TPONTOS) AS Menor_Desempenho
FROM DADOS.GERAL
WHERE OP1 EQ 151;
QUIT;
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 26 
 
 
OUTPUT 

 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT MEAN(TPONTOS*(100/190)) AS Media,
STD(TPONTOS*(100/190)) AS Variancia,
T(TPONTOS*(100/190)) AS T,
MEAN(TPONTOS*(100/190))/(STD(TPONTOS*(100/190))/N(TPONTOS)
**(1/2)) AS Est_Teste
FROM DADOS.GERAL;
QUIT;
 
OUTPUT 

 
 
 
  Alem  da  possibilidade  de  aplicar  as  funções  a  todo  o  conjunto  de  valores,  é  possível 
obter o mesmo resultado em subconjuntos, simultaneamente. No exemplo a seguir, calcula‐se 
a média em cada um dos campus. 
 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT CAMPUS,
AVG(GERAL.TPONTOS)AS Medias
FROM DADOS.GERAL
GROUP BY CAMPUS;
QUIT;
 
OUTPUT 

 
 
2.13 Predicados 
 
  Os  predicados  são  indicados  quando  desejamos  comparar  duas  condições  ou 
expressões. 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 27 
 
 

 
 
2.13.1 Selecionando um Grupo de Valores 
 
  Vimos  anteriormente  que  é  possível  selecionar  um  intervalo  específico  de  dados 
através da utilização de operadores lógicos. O comando BETWEEN é uma simplificação de uma 
destas operações. 
 
CÓDIGO SQL 
PROC SQL;
SELECT INSCRICAO,
ISENTO,
TPONTOS
FROM DADOS.GERAL
WHERE TPONTOS BETWEEN 20 AND 21
ORDER BY TPONTOS DESC;
QUIT;
 
OUTPUT 

 
 
 
2.13.2 Selecionando valores nulos 
 
CÓDIGO SQL 

PROC SQL;
SELECT INSCRICAO,
ISENTO,
TPONTOS
FROM DADOS.GERAL
WHERE TPONTOS IS NULL;
QUIT;

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 28 
 
SAS LOG 

 
 
2.13.2 Selecionando valores não nulos 
 
  Similarmente ao exemplo anterior, podemos aplicar a função NOT IS NULL ou IS NOT 
NULL para selecionar os valores diferentes de zero de nosso conjunto de dados. 
 
CÓDIGO SQL 
PROC SQL;
SELECT INSCRICAO,
ISENCAO.SN,
TPONTOS,
SEXO.SX
FROM DADOS.GERAL, DADOS.ISENCAO, DADOS.SEXO
WHERE TPONTOS IS NOT NULL AND
GERAL.CAMPUS = 1 AND
GERAL.SEXO = 1 AND GERAL.SEXO = SEXO.SEXO AND
OP1 = 137 AND
TPONTOS GT 140 AND
GERAL.ISENTO = ISENCAO.ISENTO;
QUIT;
 
OUTPUT 

 
 
 
 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 29 
 
2.13.2 Aplicando a Função LIKE 
 
  Através desta função, é possível selecionar informações que contenham uma parte 
específica de texto. No exemplo a seguir, selecionaremos apenas as cidades que começam 
com a palavra “SAO”. 
 
CÓDIGO SQL 
PROC SQL;
SELECT DISTINCT CIDADE
FROM DADOS.GERAL
WHERE CIDADE LIKE 'SAO%';
ORDER BY CIDADE;
QUIT;
 
OUTPUT PARCIAL 

 
Já  neste  próximo  exemplo,  o  objetivo  é  obter  as  cidades  que  contenham  a  palavra 
“SAO”, não importando em que parte. 
 
CÓDIGO SQL 
PROC SQL;
SELECT DISTINCT CIDADE
FROM DADOS.GERAL
WHERE CIDADE LIKE '%SAO%';
ORDER BY CIDADE;
QUIT;
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 30 
 
OUTPUT PARCIAL 

 
 
  Outra  opção  é  obtermos  informações  que  começam  com  uma  determinada  letra, 
podendo  fixar  o  número  máximo  de  caracteres  através  do  comando  underline  “_”.  No 
exemplo abaixo, desejamos obter os cursos que começam por “E” e que sejam constituídos de 
no máximo mais 10 outras letras quaisquer. 
 
CÓDIGO SQL 
PROC SQL;
SELECT NOME_CURSO
FROM DADOS.CURSO
WHERE NOME_CURSO LIKE 'E__________';
QUIT;
 
OUTPUT 

 
 
 
  Variações desta mesma ferramenta nos permitem uma infinidade de opções. Abaixo, 
obteremos palavras cuja quarta letra seja “a”, sem restrições às demais. 
 
CÓDIGO SQL 
PROC SQL;
SELECT NOME_CURSO
FROM DADOS.CURSO
WHERE NOME_CURSO LIKE '___a%';
QUIT;
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 31 
 
OUTPUT 

 
 
2.13.3 Função CONTAINS 
 
  Esta função assemelha‐se muito à função LIKE, em que nos permite selecionar dados 
que  contenham  determinados  trechos  ou  características,  em  qualquer  parte  do  texto.  O 
resultado abaixo também pode ser conseguido utilizando “?” no lugar de CONTAINS. 
 
CÓDIGO SQL 
PROC SQL;
SELECT NOME_CURSO
FROM DADOS.CURSO
WHERE NOME_CURSO CONTAINS 'tec';
QUIT;

CÓDIGO SQL 
PROC SQL;
SELECT NOME_CURSO
FROM DADOS.CURSO
WHERE NOME_CURSO ? 'tec';
QUIT;
 
  Outra possibilidade é utilizando “%” antes e após o trecho desejado. 

CÓDIGO SQL 
PROC SQL;
SELECT NOME_CURSO
FROM DADOS.CURSO
WHERE NOME_CURSO LIKE '%tec%';
QUIT; 
 
OUTPUT 

 
 
 
 
2.13.3 Função SOUNDS‐LIKE 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 32 
 
  A  função  SOUNDS‐LIKE  cujo  operador  é  dado  por  (=*)  é  uma  ferramenta  muito 
interessante.  Ela  permite  que  encontremos  pequenas  variações  de  uma  palavra,  cuja 
gramática ou mesmo fonética seja semelhante. 
 
CÓDIGO SQL 
PROC SQL;
SELECT CIDADE
FROM DADOS.GERAL
WHERE CIDADE =* 'SANTA BARBARA D´OESTE';
QUIT;
OUTPUT PARCIAL 

 
2.13.3 Verificando a Existência de um Valor 
 
  Através  da  função  EXISTS,  é  possível  verificar  se  dados  de  um  terminando  data  sets 
possui  informações  guardadas  em  outro  determinando  banco.  No  exemplo  a  seguir, 
verificaremos  quais  observações  da  tabela  GERAL  possui  informações  referentes  à  variável 
Campus presente na tabela CAMPUS. 
 
 
CÓDIGO SQL 
PROC SQL;
SELECT INSCRICAO,
ISENTO,
CAMPUS
FROM DADOS.GERAL G
WHERE EXISTS
(SELECT *
FROM DADOS.CAMPUS C
WHERE G.CAMPUS = C.CAMPUS);
QUIT;
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 33 
 
OUTPUT PARCIAL 

 
  Percebe‐se  que  todas  as  observações  do  banco  foram  selecionadas,  já  que  todas 
possuem o valor da variável Campus. 
 
2.14 Operações Condicionais 
 
  Outra  função  muito  interessante  é  a  CASE,  que  permite  a  inclusão  de  condições  às 
operações  executadas  dentre  da  função  SELECT.  Como  exemplo,  calcularemos  o 
aproveitamento  dos  cursos,  levando  em  consideração  um  total  de  pontos  igual  a  190,  com 
exceção da Música, que devido à prova de aptidão, possui um total de 220 pontos. 
 
CÓDIGO SQL 
PROC SQL;
SELECT OP1 'CURSOS',
CASE OP1
WHEN 22 THEN MEAN(TPONTOS*(100/230))
ELSE MEAN(TPONTOS*(100/190))
END "APROVEITAMENTOS"
FROM DADOS.GERAL
GROUP BY OP1;
QUIT;

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 34 
 
OUTPUT PARCIAL 

2.14 Inserindo um texto 
 
CÓDIGO SQL 

PROC SQL;
SELECT OP1 'CURSOS',
'O aproveitamento é:',
CASE OP1
WHEN 22 THEN MEAN(TPONTOS*(100/230))
ELSE MEAN(TPONTOS*(100/190))
END "APROVEITAMENTOS"
FROM DADOS.GERAL
GROUP BY OP1;
QUIT;

OUTPUT PARCIAL 

 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 35 
 
2.15 Operador IN 
  O  operador  IN  é  uma  simplificação  do  operador  WHERE.  No  exemplo  abaixo, 
realizaremos funções idênticas utilizando os dois operadores. 
 
CÓDIGO SQL 
PROC SQL;
SELECT OP1 'Cursos',
INSCRICAO 'Número de Inscrição',
SEXO 'Sexo'
FROM DADOS.GERAL
WHERE INSCRICAO = 1209892 OR
INSCRICAO = 1000373 OR
INSCRICAO = 1210041;
QUIT;

CÓDIGO SQL 
PROC SQL;
SELECT OP1 'Cursos',
INSCRICAO 'Número de Inscrição',
SEXO 'Sexo'
FROM DADOS.GERAL
WHERE INSCRICAO IN (1209892,1000373,1210041);
QUIT;

OUTPUT 

 
  Alem  disso,  podemos  acrescentar  a  função  NOT  como  forma  de  exclusão  de  uma 
particularidade em questão. 

CÓDIGO SQL 
PROC SQL;
SELECT CC 'Campus',
Campus 'Número de Inscrição'
FROM DADOS.CAMPUS
WHERE CC NOT IN ('Araras','Sorocaba');
QUIT;

OUTPUT 

2.16 A Função HAVING 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 36 
 
   
O  comando  HAVING,  assim  como WHERE, determina  quais  linhas  de  determinada  tabela 
serão  selecionadas.  Porem  a  função  WHERE  deve  ser  utilizada  antes  que  um  o  comando 
GROUP  ocorra,  já  que  ela  é  aplicada  em  linhas.  No  caso  da  ferramenta  HAVING,  isso  não  é 
necessário, já que é aplicado diretamente aos grupos de dados. 
No  exemplo  abaixo  verificamos  que  o  comando  HAVING  será  usado  após  o  comando 
GROUP. 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT OP1,
MAX(TPONTOS) 'Máximo',
AVG(TPONTOS) 'Média',
MIN(TPONTOS) 'Mínimo',
COUNT(TPONTOS) 'Numero de Inscritos'
FROM DADOS.GERAL
GROUP BY OP1
HAVING AVG(TPONTOS) GE 80;
QUIT;
 
OUTPUT 

 
Podemos  ainda  trabalhar  conjuntamente  com  as  funções  HAVING  e  WHERE  como 
vemos no exemplo abaixo. 

CÓDIGO SQL 
 
PROC SQL;
SELECT CURSO.NOME_CURSO 'Curso',
AVG(TPONTOS) 'Média',
STD(TPONTOS) 'Desvio Padrão',
RANGE(TPONTOS) 'Amplitude'
FROM DADOS.GERAL, DADOS.CURSO
WHERE GERAL.OP1 = CURSO.OP1
GROUP BY CURSO.NOME_CURSO
HAVING AVG(TPONTOS) LE 60;
QUIT;
 
 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 37 
 
OUTPUT 

2.17 Trabalhando com Caracteres 
 
Existem uma infinidade de possibilidades quando trabalhamos com variáveis categóricas. 
Nos  exemplos  a  seguir,  veremos  algumas  das  aplicações  e  operações  disponíveis  através  da 
linguagem SQL. 
 
2.17 Concatenando duas variáveis categóricas 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT CIDADE,
CAMPUS.CC,
CIDADE || "," || CAMPUS.CC AS NOVA_VARIAVEL
FROM DADOS.GERAL, DADOS.CAMPUS
WHERE GERAL.CAMPUS = CAMPUS.CAMPUS;
QUIT;
 
OUTPUT PARCIAL 

 
 
 
2.17.2 Tamanho de um String 
 
 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 38 
 
CÓDIGO SQL 
PROC SQL;
SELECT NOME_CURSO,
LENGTH(NOME_CURSO) AS TAMANHO
FROM DADOS.CURSO;
QUIT;

OUTPUT PARCIAL 

 
 
 
3 Trabalhando com PROC SQL utilizando MACROS 
 
Uma  grande  vantagem  ao  se  utilizar  SQL  é  a  possibilidade  de  criar  uma  interface  com  a 
linguagem SAS MACRO.  Esta implementação permite ao programador customizar operações e 
estender as capacidades do procedimento SQL. 
Uma macro é basicamente um procedimento que busca resumir um trecho repetitivo de 
código em um conjunto de operações cuja única diferença se dá pelo padrão de entrada, que 
mudará para cada uma das implementações que realizará. 
 
3.1 Criando Tabelas simultaneamente através de Macros 
 
  Inicialmente,  prepararemos  um  novo  conjunto  de  dados  CATEG,  criando  novas 
variáveis que servirão como parâmetros para a nova Macro. Teremos como objetivo a criação 
de quatro tabelas que conterão as variáveis INSCRICAO, CIDADE e TPONTOS alem da variável 
única a cada uma delas: SEXO, ISENTO, CAMPUS, MAT. 
 
 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 39 
 
CÓDIGO SQL 
 
ODS LISTING CLOSE;
ODS OUTPUT SQL_Results = DADOS.CATEG;
PROC SQL;
SELECT INSCRICAO,
CIDADE,
TPONTOS,
SEXO AS V1,
ISENTO AS V2,
CAMPUS AS V3,
MAT AS V4
FROM DADOS.GERAL;
QUIT;
ODS OUTPUT CLOSE;
ODS LISTING;
 
  A seguir, criaremos uma Macro chamada MACRO1 que produzira quatro tabelas para 
cada uma das variáveis V1, V2, V3 e V4. 
 
CÓDIGO SQL 
 
%MACRO MACRO1;
%DO i=1 %TO 4;
PROC SQL;
SELECT INSCRICAO,
CIDADE,
TPONTOS,
V&i
FROM DADOS.CATEG
WHERE (TPONTOS GE 155 AND TPONTOS LE 160)
ORDER BY V&i;
QUIT;
%end;
%mend MACRO1;
%MACRO1;
 
OUTPUT 
TABELA 1          TABELA 2 

 
 
 
 
 
 
 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 40 
 
 
TABELA 3          TABELA 4 

 
 
 
3.2 Criando Tabelas específicas através de uma Macro ‐ Função 
 
  Podemos  ainda  criar  macros  na  forma  de  funções  cujos  parâmetros  sejam  definidos 
pelo  programador,  de  acordo  com  seu  interesse.  Diferentemente  do  exemplo  anterior,  esse 
tipo de macro retornará apenas a tabela para qual foi designada, dependendo do argumento 
fornecido.  
 
3.2.1 Macros de um parâmetro: 
 
CÓDIGO SQL 
%MACRO FORMAT(VAR);
%IF %UPCASE(&VAR) = SEXO
%THEN %DO;
PROC SQL;
SELECT INSCRICAO 'Inscrição',
TPONTOS 'Total de Pontos',
CIDADE 'Cidade',
SX 'Sexo'
FROM DADOS.GERAL, DADOS.SEXO
WHERE GERAL.SEXO = SEXO.SEXO
ORDER BY TPONTOS DES
%END;
%ELSE %IF %UPCASE(&VAR) = ISENTO
%THEN %DO;
PROC SQL;
SELECT INSCRICAO 'Inscrição',
TPONTOS 'Total de Pontos',
CIDADE 'Cidade',
SN 'Possui Isenção'
FROM DADOS.GERAL, DADOS.ISENCAO;
WHERE GERAL.SEXO = ISENCAO.ISENTO
ORDER BY TPONTOS DES
%END;
%ELSE %IF %UPCASE(&VAR) = CAMPUS
%THEN %DO;
PROC SQL;
SELECT INSCRICAO 'Inscrição',
TPONTOS 'Total de Pontos',
CIDADE 'Cidade',
CC 'Campus'
FROM DADOS.GERAL, DADOS.CAMPUS;

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 41 
 
WHERE GERAL.SEXO = CAMPUS.CAMPUS
ORDER BY TPONTOS DES
%END;
%ELSE %IF %UPCASE(&VAR) = MAT
%THEN %DO;
PROC SQL;
SELECT INSCRICAO 'Inscrição',
TPONTOS 'Total de Pontos',
CIDADE 'Cidade',
MATRICULADOS 'ESTÁ MATRICULADO'
FROM DADOS.GERAL, DADOS.MATRICULADOS;
WHERE GERAL.SEXO = MATRICULADOS.MAT
ORDER BY TPONTOS DES
%END;
%ELSE %DO;
%PUT Variável Não Válida!;
QUIT;
%END;
%MEND FORMAT;
%FORMAT(SEXO);
 
OUTPUT PARCIAL 

 
3.2.2 Utilizando mais de um parâmetro 
 
CÓDIGO SQL 
%MACRO AGRUP(LIB, TAB, GROUP);
PROC SQL;
SELECT &GROUP,
MAX(TPONTOS) 'Máximo',
AVG(TPONTOS) 'Média',
MIN(TPONTOS) 'Mínimo',
COUNT(TPONTOS) 'Numero de Inscritos'
FROM &LIB..&TAB
GROUP BY &GROUP
HAVING AVG(TPONTOS) GE 80;
QUIT;
%MEND AGRUP;
%AGRUP(DADOS,GERAL,SEXO);

 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 42 
 
OUTPUT 

 
 
4. Utilizando Sub‐Funções 
 
CÓDIGO SQL 

ODS LISTING CLOSE;


ODS OUTPUT SQL_Results = DADOS.SCARLOS;
PROC SQL;
SELECT INSCRICAO,
TPONTOS,
CC,
NOME_CURSO
FROM DADOS.GERAL, DADOS.CAMPUS, DADOS.CURSO
WHERE GERAL.CAMPUS = CAMPUS.CAMPUS AND
GERAL.OP1 = CURSO.OP1 AND
GERAL.OP1 = 61;
QUIT;
ODS OUTPUT CLOSE;
ODS LISTING;

ODS LISTING CLOSE;


ODS OUTPUT SQL_Results = DADOS.SOROCABA;
PROC SQL;
SELECT INSCRICAO,
TPONTOS,
CC,
NOME_CURSO
FROM DADOS.GERAL, DADOS.CAMPUS, DADOS.CURSO
WHERE GERAL.CAMPUS = CAMPUS.CAMPUS AND
GERAL.OP1 = CURSO.OP1 AND
GERAL.OP1 = 63;
QUIT;
ODS OUTPUT CLOSE;
ODS LISTING;

OUTPUT PARCIAL – SCARLOS 

 
 
 
 
 
 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 43 
 
OUTPUT ‐ SOROCABA 

 
CÓDIGO SQL 
 
PROC SQL;
SELECT *
FROM DADOS.SCARLOS
WHERE TPONTOS >
(SELECT AVG(TPONTOS)
FROM DADOS.SOROCABA)
ORDER BY TPONTOS ASC;
QUIT;

OUTPUT PARCIAL ‐ SOROCABA 

 
 
4.1 Utilizando as funções ANY  e ALL em Sub‐Querys 
 
  Através da função ANY, podemos selecionar valores que satisfaçam qualquer uma das 
restrições  fixadas  pelo  programador.  Na  tabela  abaixo,  pode‐se  visualizar  isto  com  maior 
clareza. 

 
 
 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 44 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT INSCRICAO,
NOME_CURSO,
CC,
TPONTOS
FROM DADOS.GERAL, DADOS.CAMPUS, DADOS.CURSO
WHERE GERAL.OP1 = CURSO.OP1 AND
GERAL.CAMPUS = CAMPUS.CAMPUS AND
GERAL.OP1 EQ 61 AND
TPONTOS > ANY
(SELECT AVG(TPONTOS)
FROM DADOS.GERAL
WHERE OP1 BETWEEN 62 AND 64
GROUP BY OP1)
ORDER BY TPONTOS ASC;
QUIT;
 
OUTPUT PARCIAL 

 
 
 
  De forma similar, podemos utilizar a função ALL para obter resultados parecidos. Na 
tabela abaixo, pode‐se observar qual o retorno encontrado ao aplicar a função. 
 

 
 
CÓDIGO SQL 
 
PROC SQL;
SELECT INSCRICAO,
NOME_CURSO,
CC,
TPONTOS
FROM DADOS.GERAL, DADOS.CAMPUS, DADOS.CURSO

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 45 
 
WHERE GERAL.OP1 = CURSO.OP1 AND
GERAL.CAMPUS = CAMPUS.CAMPUS AND
GERAL.OP1 EQ 61 AND
TPONTOS > ALL
(SELECT AVG(TPONTOS)
FROM DADOS.GERAL
WHERE OP1 BETWEEN 62 AND 64
GROUP BY OP1)
ORDER BY TPONTOS ASC;
QUIT;
 
OUTPUT PARCIAL 

 
 
 
 
Referências Bibliográficas: 
 
Lafler, K. P. (2004) – PROC SQL: Beyond the Basics Using SAS, SAS Institute Inc. 
 
Prairie, K. ( 2005) – The Essential PROC SQL Handbook for SAS Users, SAS Institute Inc. 
 

Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐  Janeiro 2010   Página 46 
 

Vous aimerez peut-être aussi