SQL - Columnas calculadas

   
Vista:

Columnas calculadas

Publicado por Adan (2 intervenciones) el 13/05/2015 01:21:14
¿Como puedo usar una columna calculada mas de una vez sin volverla a calcular?

ejemplo:

SELECT Cantidad1,
Cantidad2,
(Cantidad1 * Cantidad2) AS 'Cantidad3',
Cantidad4,
('Cantidad3' * Cantidad4) AS 'Cantidad5'
FROM Tabla
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Columnas calculadas

Publicado por leonardo_josue (880 intervenciones) el 13/05/2015 16:33:14
Hola Adan:

Lamentablemente no puedes hacerlo, una columna calculada "existe" sólo hasta después de la ejecución de la consulta, por lo tanto no puedes usarla al mismo tiempo en que la estás calculando. Necesariamente tendrás que hacer el recálculo o en su defecto hacer uso de SUBCONSULTAS, observa este ejemplo:

Supongamos que tienes tu tabla así:

1
2
3
4
5
6
7
8
9
mysql> SELECT id, cantidad1, cantidad2, cantidad4 FROM tabla;
+------+-----------+-----------+-----------+
| id   | cantidad1 | cantidad2 | cantidad4 |
+------+-----------+-----------+-----------+
|    1 |        10 |        20 |        30 |
|    2 |        34 |        12 |        27 |
|    3 |         2 |         2 |         2 |
+------+-----------+-----------+-----------+
3 rows in set (0.00 sec)

Para calcular las columnas 3 y 5, puedes hacerlo repitiendo el cálculo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT
    ->   Cantidad1,
    ->   Cantidad2,
    ->   (Cantidad1 * Cantidad2) Cantidad3,
    ->   Cantidad4,
    ->   ((Cantidad1 * Cantidad2) * Cantidad4) Cantidad5
    -> FROM Tabla;
+-----------+-----------+-----------+-----------+-----------+
| Cantidad1 | Cantidad2 | Cantidad3 | Cantidad4 | Cantidad5 |
+-----------+-----------+-----------+-----------+-----------+
|        10 |        20 |       200 |        30 |      6000 |
|        34 |        12 |       408 |        27 |     11016 |
|         2 |         2 |         4 |         2 |         8 |
+-----------+-----------+-----------+-----------+-----------+
3 rows in set (0.00 sec)

O hacer primero el cálculo de la columna 3 mediante una subconsulta y después el cálculo de la columna 5:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> SELECT
    ->   T1.cantidad1,
    ->   T1.cantidad2,
    ->   T1.cantidad3,
    ->   T1.cantidad4,
    ->   (T1.cantidad3 * T1.Cantidad4) cantidad5
    -> FROM
    -> ( SELECT
    ->     cantidad1,
    ->     cantidad2,
    ->     (cantidad1 * cantidad2) cantidad3,
    ->     cantidad4
    ->   FROM tabla ) T1;
+-----------+-----------+-----------+-----------+-----------+
| cantidad1 | cantidad2 | cantidad3 | cantidad4 | cantidad5 |
+-----------+-----------+-----------+-----------+-----------+
|        10 |        20 |       200 |        30 |      6000 |
|        34 |        12 |       408 |        27 |     11016 |
|         2 |         2 |         4 |         2 |         8 |
+-----------+-----------+-----------+-----------+-----------+
3 rows in set (0.00 sec)

En este caso SÍ PUEDES HACER ALGO COMO ESTO:

1
(T1.cantidad3 * T1.Cantidad4) cantidad5

Ya que el campo cantidad3, ya existe, pues se ejecuta primero la subconsulta antes que la consulta externa.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Columnas calculadas

Publicado por Adan (2 intervenciones) el 13/05/2015 17:36:19
Que tal Leonardo,

Entiendo, muchas gracias por tu respuesta, tus ejemplos son muy claros, usare la subconsulta para familiarizarme ya que no las he usado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Columnas calculadas

Publicado por Salvador (14 intervenciones) el 14/05/2015 08:10:06
Hola Adan,

También si los campos a calcular son los mismo, crea un campo que lo haga por ti y solo tienes que poner el campo, eje.
1
2
3
4
5
6
7
8
9
CREATE TABLE MyTable
  (
    ID         int IDENTITY(1,1)
    ,CANTIDAD1 int
    ,CANTIDAD2 int
    ,(CANTIDAD1 * CANTIDAD2) AS CANTIDAD3
    ,CANTIDAD4 int
    ,(CANTIDAD3 * CANTIDAD4) AS CANTIDAD5
  )

y a la hora de hacer la SQL, solo tienes que poner
1
2
3
4
5
6
7
SELECT
    CANTIDAD1
    ,CANTIDAD2
    ,CANTIDAD3 <-- Lo hace automático
    ,CANTIDAD4
    ,CANTIDAD5 <-- Lo hace automático
  FROM MyTable

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Columnas calculadas

Publicado por leonardo_josue (880 intervenciones) el 14/05/2015 16:42:43
Hola de nuevo compañer@s:

Sólo un comentario referente a lo que comenta el compañero Salvador: Los campos calculados como campos "físicos" en una tabla no son soportados por todos los DBMS's... supongo que el ejemplo que pones lo estás haciendo con SQL Server, que sí te permite hacer lo que comentas, pero otros no manejan el concepto de campos calculados.

Además, por cuestiones de Normalización de BD's un campo que puede ser calculado NUNCA DEBE DE COLOCARSE EN UNA TABLA.

Sin embargo afortunada o desafortunadamente en esto de la informática no hay una "mejor" o "peor" forma de hacer las cosas, todo depende de las necesidades del proyecto y las herramientas con las que se cuentan.

Hay muchas formas de matar una mosca, pero una pistola puede resultar demasiado, así es que evalúa las opciones que tienes y elige la que más te convenga.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

Columnas calculadas

Publicado por Isaias (691 intervenciones) el 14/05/2015 19:56:03
¿Y una bomba atómica? ....No es broma.....lo siento, no pude evitarlo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Columnas calculadas

Publicado por Salvador (14 intervenciones) el 15/05/2015 09:44:26
Hola Leo,

Un campo calculado es eso, calcula el valor de dos o mas campos y, no se almacena físicamente en la base de datos, si la base de datos te lo brinda, porque no utilizarlo, en otras base de datos no tienen esa característica, que le vamos hacer.

Por ejemplo, si tienes separado el nombre y los apellidos y los quieres juntar, puedes hacer dos cosa:
1
2
3
4
5
6
7
8
9
1: SELECT
           (APELLLIDOS + ', ' + NOMBRE) AS NOMBRECOMPLETO
         FROM Clientes
 
    2: En la base de datos has definido; (APELLIDOS + ', ' + NOMBRE) AS NOMBRECOMPLETO
      SELECT
          NOMBRECOMPLETO
        FROM Clientes
        WHERE NOMBRECOMPLETO LIKE '%Salvador%'

En este caso incluso puedes buscar por el campo calculado.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar