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,

 

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

Discussion stats
  • 4 replies
  • 702 views
  • 3 likes
  • 3 in conversation