Comment extraire une "sous-chaîne" d'une variable numérique ?
Simon 26 Aufrufe
Schwierigkeitsgrad
Débutant
Veröffentlicht am :
Expertenrat
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.
Wichtiger Haftungsausschluss
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.