martes, 8 de julio de 2014

Receta T-SQL No. 1-6: Creación de una Columna a partir de una Expresión

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código T-SQL
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Crearemos una receta T-SQL para demostrar la creación de una nueva columna a partir de una expresión compuesta por constantes u otras columnas pertenecientes a una tabla determinada. Reconoceremos la utilidad de este tipo de expresiones como reemplazo a columnas que contienen el resultado de una expresión resultante del cómputo (e.g., aritmética, concatenación) de otras columnas en la propia tabla.

1. Problema

Contamos con dos columnas en la tabla Employee que corresponden con el tiempo máximo de vacaciones y de incapacidad. Deseamos calcular el tiempo total de retiro del empleado del trabajo sin tener que crear una nueva columna en la tabla Employee.

2. Solución

La creación de alias de columnas (Renombrar las Columnas Generadas por una Consulta) se conjuga con cómputos (e.g., operaciones aritméticas básicas, concatenación) para la generación de columnas temporales o virtuales. Para crear un columna a partir de una expresión (formalmente conocidas como columna calculada) debemos seguir este par de pasos:
  1. Especificación de la expresión, y
  2. creación de un alias para la columna calculada.
En términos generales:

SELECT una_columna, otra_columna, {expresion} AS "Nombre Columna Calculada" FROM nombre_tabla;

3. Discusión de la Solución

Una columna calculada es sinónimo de dependencia de otras columnas. Crear esta dependencia en la definición física de una tabla no es un camino viable; en su lugar podemos crear columnas virtuales (o calculadas) para remover no solo la dependencia entre columnas sino además la lógica del cálculo que puede requerirse sobre la base de datos [3].

Previamente vimos que para la formación de una columna calculada vimos que es necesario contar una expresión que estará compuesta por una serie de columnas pertenecientes a la misma tabla. (En [3] advierten que es posible usar funciones definidas por el propio programador.)

Construyamos un ejemplo sencillo que consistirá en generar la dirección completa de una persona a partir de las siguientes columnas físicas de la tabla Person.Address de la base de datos AdventureWorks2012:
  • City, y
  • AddressLine1
La consulta nos quedará construida de la siguiente manera:

SELECT City + ' ' + AddressLine1 AS "Dirección Completa" FROM Person.Address;

A tener en cuenta los siguientes puntos acerca de esta consulta:
  • La concatenación de las columnas se realiza con el operador de suma sobrecargado.
  • Podemos incluir espacios entre los valores de las columnas de la expresión con una cadena que contenga un espacio: ' '.
  • Uso de la clausula AS para especificar el nombre de la columna calculada: AS "Dirección Completa".
Cuando ejecutemos esta consulta en SQL Server 2014 Management Studio obtendremos:
Creación de una columna calculada: Dirección Completa
Figura 1. Creación de una columna calculada: Dirección Completa.

Otros apuntes importantes acerca del uso de columnas calculadas [3]:
  • «A computed column in a table is not allowed to be used in another computed-column in the same table.»
  • «Computed columns are actually not physically created on the related database table unless they are definied as "PERSISTED" computed columns.»

4. Práctica: Código T-SQL

Construyamos la consulta para calcular el tiempo máximo que puede estar un empleado retirado de su trabajo debido a la toma de vocaciones y la incapacidad:

SELECT BusinessEntityID AS "ID Empleado",
VacationHours + SickLeaveHours AS "Tiempo Indisponibilidad"
FROM HumanResources.Employee;

Al ejecutar esta consulta con F5 en SQL Server 2014 Management Studio obtenemos el siguiente resultado:
Columna calculada Tiempo Indisponibilidad
Figura 2. Columna calculada Tiempo Indisponibilidad.
Vale agregar la nota de advertencia en [1] respecto a omitir el nombre (alias) a la columna calculada, como en:

SELECT BusinessEntityID AS "ID Empleado",
VacationHours + SickLeaveHours AS "Tiempo Indisponibilidad"
FROM HumanResources.Employee;

Resultado:
Columna calculada sin nombre (alias)
Figura 3. Columna calculada sin nombre (alias).
Notamos que en la sección resaltada de la Figura 3 se genera la leyenda (No column name). Esto genera dificultades de referenciación en el código fuente de aplicación; por eso es importante e imprescindible especificar un nombre legible y consistente con el cálculo generado.

Conclusiones

Comprendimos cómo crear una expresión compuesta columnas y asignarle un nombre (o alias) para generar una nueva columna compuesta por el resultado de la evaluación de la expresión. A este tipo de columnas se le conoce como columna calculada. Además, se dejó claro que por ninguna circunstancia (a menos que se trate de una simple prueba) se debe omitir el nombre de la columna calculada, pues dificulta su uso desde aplicaciones de datos que quieran referirse precisamente a ese columna y usar los valores integrales de esta.

Glosario

  • Columna calculada
  • Expresión
  • SQL-Server
  • T-SQL

Literatura & Enlaces

[1]: SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach by Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield. Copyright 2012 Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield, 978-1-4302-4200-0.
[2]: Computed Columns - http://technet.microsoft.com/en-us/library/ms191250(v=SQL.105).aspx
[3]: How to Use Computed Column in SQL Server Databases with Computed-Column Samples - http://www.kodyaz.com/articles/sql-server-computed-column-calculated-column-sample.aspx


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.