Proc SQL

¿Cómo extraer una "subcadena" de una variable numérica?

Simon 29/04/2021 3 vues

Cuando se empieza con SAS© y el procedimiento SQL (PROC SQL), un error frecuente es querer manipular variables numéricas como si fueran cadenas de caracteres.

Un caso clásico es el de una columna de identificador o de fecha almacenada en formato numérico (por ejemplo, 20190901 para el 1 de septiembre de 2019). Si intenta utilizar la función SUBSTR para extraer el año "2019" en una cláusula WHERE, SAS© devolverá un error.

¿Por qué? Porque SUBSTR espera una cadena de caracteres, y no un número. Además, intentar comparar el resultado (cadena) con un número (2019) crea una incompatibilidad de tipo.

Aquí hay tres métodos para resolver este problema, desde el más "matemático" hasta la "mejor práctica".

Illustration

1. El método matemático (Aritmético)

Si su columna es numérica, la solución más eficiente suele ser permanecer en el dominio numérico. En lugar de intentar cortar el texto, utilice las matemáticas.

Imaginemos una variable date_id que contiene 20190901. Para recuperar los 4 primeros dígitos (el año), basta con dividir por 10 000 y conservar solo la parte entera.

Código SAS©:

1PROC SQL;
2 select count(receipt_number)
3 from ma_table
4 where floor(date_id / 10000) = 2019;
5QUIT;
Aquí, 20190901 / 10000 da 2019.0901. La función FLOOR redondea al entero inferior, es decir, 2019.

Si necesitara extraer una parte en medio del número, la lógica se volvería más compleja (una mezcla de restas y divisiones), lo que hace que este método sea menos legible para extracciones complejas.

2. El método de conversión (Tipado explícito)

Si insiste en tratar la variable como texto, debe convertirla explícitamente. No basta con usar PUT, a menudo hay que gestionar los espacios que pueden insertarse durante la conversión.

Sin embargo, este método suele ser más verboso y propenso a errores de comparación (comparar una cadena '2019' con el número 2019).

3. La "Mejor Práctica": Convertir a una fecha SAS real

Si su variable numérica representa en realidad una fecha (como 20190901), el método más robusto y limpio es transformarla en un verdadero valor de fecha SAS©. Una vez convertida, puede utilizar las potentes funciones de fecha de SAS© (YEAR, MONTH, DAY).

Para transformar un número YYYYMMDD en una fecha SAS©, se utiliza la combinación de INPUT y PUT:

  1. PUT(date_id, 8.): Transforma el número en una cadena de caracteres.

  2. INPUT(..., yymmdd8.): Lee esta cadena para crear una fecha SAS© válida.

Código 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;

Ventajas:

  • Legibilidad: Se entiende inmediatamente que se está filtrando por el año.

  • Flexibilidad: Puede cambiar fácilmente para filtrar por el mes (MONTH() = 9) o el día, sin tener que rehacer cálculos matemáticos complejos.