Proc SQL

Comment extraire une "sous-chaîne" d'une variable numérique ?

Simon 29/04/2021 2 vues

Lorsque l'on débute avec SAS© et la procédure SQL (PROC SQL), une erreur fréquente consiste à vouloir manipuler des variables numériques comme s'il s'agissait de chaînes de caractères.

Un cas classique est celui d'une colonne d'identifiant ou de date stockée sous format numérique (par exemple 20190901 pour le 1er septembre 2019). Si vous tentez d'utiliser la fonction SUBSTR pour extraire l'année "2019" dans une clause WHERE, SAS© renverra une erreur.

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".

Illustration

1. La méthode mathématique (Arithmétique)

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.

Code SAS© :

1PROC SQL;
2 select count(receipt_number)
3 from ma_table
4 where floor(date_id / 10000) = 2019;
5QUIT;
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

Si votre variable numérique représente en réalité une date (comme 20190901), la méthode la plus robuste et la plus propre est de la transformer en une véritable valeur de date SAS©. Une fois convertie, vous pouvez utiliser les puissantes fonctions temporelles de SAS© (YEAR, MONTH, DAY).

Pour transformer un nombre YYYYMMDD en date SAS©, on utilise la combinaison INPUT et PUT :

  1. PUT(date_id, 8.) : Transforme le nombre en chaîne de caractères.

  2. INPUT(..., yymmdd8.) : Lit cette chaîne pour créer une date SAS© valide.

Code SAS© :

1PROC 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;
6QUIT;

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.