BookmarkSubscribeRSS Feed
phmar
Calcite | Level 5

Olá,

 

Estou passando um código do SQL Server Managament para o SAS Guide, porém estou tendo problemas no Union.

 

O Valor que o SAS gera é bem diferente do que SQL traz, vem bem mais abaixo, alguém consegue me ajudar? Abaixo estou colocando o codigo que criei.

 

PROC SQL;
CREATE TABLE corp_union AS
SELECT num_ano_mes_referencia as Ano_Mes ,
cod_ciclo_faturamento as ciclo,
CASE
WHEN browsing = 1 and ('Serviço Detalhado'n = "Dados Pacote" or 'Serviço Detalhado'n = "Dados Extra Pacote") and num_ano_mes_referencia>= 202004 THEN "Browsing"
WHEN browsing = 1 and num_ano_mes_referencia <202004 THEN "Browsing"
WHEN 'Serviço Detalhado'n IN("Dados Pacote","Dados Extra Pacote","SMS/MMS","Descontos VAS") THEN "Grupo Smart"
WHEN conta = "M201065170" THEN "Provider Ebook"
ELSE 'Serviço Detalhado'n
END as servico_ajustado,
'Serviço Detalhado'n,
Vlr_final,
Sr_acounting,
fat_consumer


FROM
(select num_ano_mes_referencia
,cod_ciclo_faturamento
,conta
, 'Serviço Detalhado'n
,Browsing
,fat_consumer
,Sr_acounting
,vlr_final
FROM WORK.MAPA_FATURA
WHERE fat_consumer <> 1 and Vlr_final <> 0 and num_ano_mes_referencia = 202207

UNION

SELECT num_ano_mes_referencia
,cod_ciclo_faturamento
,conta
,'Serviço Detalhado'n
,browsing
,COALESCE(fat_consumer, fat_consumer,0) as fat_consumer
,COALESCE(sr_acounting ,sr_acounting,0) as sr_acounting
,vlr_final

FROM WORK.RESUMO_MANUAL
WHERE Vlr_final <> 0
and num_ano_mes_referencia = 202207) i ;
QUIT;

 

 

4 REPLIES 4
OliveiraMiguelZ
Obsidian | Level 7
Tenta referenciar todas as colunas com o aliás de referência.

Digo não deixar só

SELECT
vlr
FROM Tabela

Tenta usar assim para todos

SELECT
t1.*
FROM Tabela t1
hZomer
Obsidian | Level 7

Olá,

 

Experimente usar o OUTER UNION CORR ali dentro do subselect, ao invés do union puro.

 

Uma dica é vc "quebrar" esse subselect em duas procs e depois fazer um proc data simples, assim:

 

data work.BASE_FIM;
set    work.BASE_1

         work.BASE_2

          ...

        work.BASE_n;
run;

 

Espero que ajude,

 

 

phmar
Calcite | Level 5

Usar o OUTER UNION CORR aonde?

não posso apendar unir as bases, to transferindo um codigo do SQL para SAS por isso preciso bater os valores

 

 

hZomer
Obsidian | Level 7

Olá,

 

Perdão pelo tempo da resposta, espero que já tenhas resolvido!

Se não, tenho duas considerações para lhe ajudar:

 

1. Você está transferindo um código do SQL antes desse código, isso? Pois suas bases no subselect estão apontando seu repositório temporário no SAS (WORK.MAPA_FATURA e WORK.RESUMO_MANUAL). Por isso sugeri em ajustar elas antes (no select de importação) e depois "apenas juntar" elas já tratadas (com o DATA SET que mencione no post anterior)!

 

2. Quanto ao union, teste dessa forma para ver se resolve:

 

PROC SQL;
CREATE TABLE corp_union AS
SELECT 
	num_ano_mes_referencia as Ano_Mes ,
	cod_ciclo_faturamento as ciclo,
	CASE	WHEN browsing = 1 and ('Serviço Detalhado'n = "Dados Pacote" or 'Serviço Detalhado'n = "Dados Extra Pacote") and num_ano_mes_referencia>= 202004 THEN "Browsing"
		WHEN browsing = 1 and num_ano_mes_referencia <202004 THEN "Browsing"
		WHEN 'Serviço Detalhado'n IN("Dados Pacote","Dados Extra Pacote","SMS/MMS","Descontos VAS") THEN "Grupo Smart"
		WHEN conta = "M201065170" THEN "Provider Ebook"
		ELSE 'Serviço Detalhado'n
	END as servico_ajustado,
	'Serviço Detalhado'n,
	Vlr_final,
	Sr_acounting,
	fat_consumer
FROM
	(
	SELECT
		num_ano_mes_referencia,
		cod_ciclo_faturamento,
		conta,
		'Serviço Detalhado'n,
		Browsing,
		fat_consumer,
		Sr_acounting,
		vlr_final
	FROM WORK.MAPA_FATURA
	WHERE fat_consumer <> 1 and Vlr_final <> 0 and num_ano_mes_referencia = 202207

	/*UNION*/ OUTER UNION CORR 

	SELECT 
		num_ano_mes_referencia,
		cod_ciclo_faturamento,
		conta,
		'Serviço Detalhado'n,
		browsing,
		COALESCE(fat_consumer, fat_consumer,0) as fat_consumer,
		COALESCE(sr_acounting ,sr_acounting,0) as sr_acounting,
		vlr_final
	FROM WORK.RESUMO_MANUAL
	WHERE Vlr_final <> 0 and num_ano_mes_referencia = 202207
	) i
;QUIT;

 

Obs.:

* Seu Case When final tem alguns tratamentos com dados tipo texto (usando o IN) onde deve-se ter extrema cautela pois qq caractere diferente (maiúsculo, minúsculo, espaço em branco, etc) vai sair do loop e ir parar no Else. Recomendo ajustar esse ponto para variável categórica ou chave primária para sua validação.

 

Espero que ajude,

 

Catch up on SAS Innovate 2026

Nearly 200 sessions are now available on demand in the Innovate Hub.

Watch Now →
Discussion stats
  • 4 replies
  • 2783 views
  • 3 likes
  • 3 in conversation