Comment extraire une "sous-chaîne" d'une variable numérique ?
Simon 26 vistas
Nivel de dificultad
Débutant
Publicado el :
Consejo del experto
Michael
En SAS, le respect de la sémantique des données est la clé d'un code durable : une date ne devrait être traitée ni comme une simple chaîne, ni comme un entier mathématique. Privilégiez toujours la conversion en véritable date SAS ; cela rend non seulement votre code plus lisible pour vos collaborateurs, mais débloque aussi toute la puissance du moteur temporel (fonctions INTNX, YRDIF) pour vos futures analyses.
Pourquoi ? Parce que SUBSTR attend une chaîne de caractères, et non un nombre. De plus, tenter de comparer le résultat (chaîne) avec un nombre (2019) crée une incompatibilité de type.
Voici trois méthodes pour résoudre ce problème, de la plus "mathématique" à la "meilleure pratique".
Si votre colonne est numérique, la solution la plus performante est souvent de rester dans le domaine numérique. Au lieu d'essayer de couper le texte, utilisez les mathématiques.
Imaginons une variable date_id contenant 20190901. Pour récupérer les 4 premiers chiffres (l'année), il suffit de diviser par 10 000 et de ne garder que la partie entière.
proc sql;
select count(receipt_number)
from ma_table
where floor(date_id / 10000) = 2019;
quit;
1
PROC SQL;
2
select count(receipt_number)
3
from ma_table
4
where floor(date_id / 10000) = 2019;
5
QUIT;
Ici, 20190901 / 10000 donne 2019.0901. La fonction FLOOR arrondit à l'entier inférieur, soit 2019.
Si vous aviez besoin d'extraire une partie au milieu du nombre, la logique deviendrait plus complexe (mélange de soustractions et de divisions), ce qui rend cette méthode moins lisible pour des extractions complexes.
2. La méthode de conversion (Typage explicite)
Si vous tenez absolument à traiter la variable comme du texte, vous devez explicitement la convertir. Il ne suffit pas d'utiliser PUT, il faut souvent gérer les espaces qui peuvent s'insérer lors de la conversion.
Cependant, cette méthode est souvent plus verbeuse et sujette aux erreurs de comparaison (comparer une chaîne '2019' avec le nombre 2019).
3. La "Meilleure Pratique" : Convertir en vraie date SAS
proc sql;
/* Création d'une date temporaire pour le filtre */
select count(receipt_number)
from ma_table
where year(input(put(date_id, 8.), yymmdd8.)) = 2019;
quit;
1
PROC SQL;
2
/* Création d'une date temporaire pour le filtre */
3
select count(receipt_number)
4
from ma_table
5
where year(INPUT(put(date_id, 8.), yymmdd8.)) = 2019;
6
QUIT;
Avantages :
Lisibilité : On comprend immédiatement que l'on filtre sur l'année.
Flexibilité : Vous pouvez facilement changer pour filtrer sur le mois (MONTH() = 9) ou le jour, sans refaire des calculs mathématiques complexes.
Aviso importante
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.