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;
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,
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
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,
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!