MySQL - Ayuda con el uso CAST en MySQL

 
Vista:
sin imagen de perfil

Ayuda con el uso CAST en MySQL

Publicado por Josue (4 intervenciones) el 23/06/2015 02:53:24

¿ COMO USAR CAST EN MYSQL ?




Hola amigos, bueno en esta ocasión vengo a hacer una consulta sobre como usar el CAST en un campo calculado en MySQL.

Anteriormente he usado el CAST en SQL pero mi duda es ahora como usarlo en MySQL?

Les dejaré la sintaxis de SQL de un campo calculado con CAST y me gustaría que me ayuden a convertirla a MySQL vale?

Esta es la sintaxis.


1
2
3
4
5
6
create table testi(
cant int,
descu money,
candesc as cant * descu,
totcandesc as cast (cant - (cant * descu) as int)
)


totcantdesc es el campo calculado que contiene el CAST que convierte al decimal a un entero cercano.

He usado el CAST en MySQL pero me arroja un error de sintaxis, puede ser por la versión o porque no es la sintaxis correcta.

Yo uso phpmyadmin y me gustaría llegar a conocer la sintaxis correcta para MySQL en el uso de CAST o si se trata de versiones, CUAL ES LA MEJOR VERSION DE phpmyadmin PARA USAR CAST.

desde ya agradezco su apoyo ya que me es de gran ayuda... gracias y saludos.


Aqui les adjunto la vista previa de la consulta realizada para este codigo.

GnJjajo
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
sin imagen de perfil
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Ayuda con el uso CAST en MySQL

Publicado por Rafael (97 intervenciones) el 23/06/2015 08:21:11
A ver a tus dudas:

¿CUAL ES LA MEJOR VERSION DE phpmyadmin PARA USAR CAST.?
Todas no es una cuestion de phpmyadmin, es una cuestion de como lo usas.

En MYSQL no existe el tipo MONEY por lo cual tambien es un error

Tu error no esta en el CAST si no en la sintaxis de la columna COMPUTADA...
1
2
3
4
5
6
create table testi(
	cant INT,
	descu DOUBLE,
	candesc DOUBLE AS (cant * descu),
	totcandesc INT as (cant - (cant * descu))
)

Ahora no se para que uses el campo totcandesc, pero a mi me suena que lo que estas calculando no es coherente...

Saludos
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
sin imagen de perfil

Ayuda con el uso CAST en MySQL

Publicado por Josue (4 intervenciones) el 23/06/2015 15:19:25
Hola, gracias por responder...

Bueno quiero aclarar algo, tengo entendido que el tipo money no existe en MySQL por lo que en ese campo he usado el tipo decimal, me olvide de dejar la sintaxis que use en MySQL la cual me arroja el error.

La sintacis que use en MySQL es la siguiente:

1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `PRUEBA` (
`CANT` int DEFAULT NULL,
  `DESCU` decimal(7,2) DEFAULT NULL,
  `CANTDESC` decimal(7,1) AS (`CANT` * `DESCU`) ,
  `TOTCANTDESC` AS CAST(`CANT` - (`CANT` * `DESCU`)AS INT)
)

Donde:

CANT es la cantidad inicial
DESCU es el descuento que se le aplica a la cantidad inicial
CANTDESC es le cantidad descontada
TOTCANTDESC es la cantidad inicial - la cantidad descontada.... En este campo quiero aplicar el CAST pero MySQL rechaza mi sintaxis, a que puede ser? si en SQL funcionar, por que no en MySQL ?
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

Ayuda con el uso CAST en MySQL

Publicado por Leopoldo Taylhardat (44 intervenciones) el 23/06/2015 16:28:34
Saludos...
el cast se usa así....

(cant - (cant * descu) as integer(decimal....) ) as totcandesc
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Ayuda con el uso CAST en MySQL

Publicado por leonardo_josue (414 intervenciones) el 23/06/2015 22:37:00
Hola Josue;

Antes que nada hay que aclarar algunos puntos.

1. Desde el punto de vista del Diseño de BD's, una columna que puede ser calculada NO DEBE EXISTIR EN LA BD'S, ya que esto es una redundancia de información. Es algo así como querer tener al mismo tiempo la fecha de nacimiento de una persona y su edad, esto sería un desperdicio, pues si sabes su fecha de nacimiento, entonces puedes calcular su edad.

2. MySQL NO PERMITE DEFINIR COLUMNAS CALCULADAS EN TABLAS... no sé de donde estás tomando el ejemplo, pero puedo suponer que se trata de SQL Server. El error de sintaxis que te está marcando la consulta seguramente es en AS... esto es porque en MySQL NO PUEDES DEFINIR UNA COLUMNA COMO EL RESULTADO DE UNA OPERACIÓN SOBRE OTRAS COLUMNAS.

3. En los campos calculados NO PUEDES HACER UN CASTEO... si sumas dos entero, el resultado siempre será un entero... de la misma manera, si multiplicas dos NUMERIC, el resultado debe ser NUMERIC, de lo contrario podrías tener un problema de desbordamiento.

Partiendo de estos puntos, lo que tienes que hacer es crear una tabla SIN CAMPOS CALCULADOS, y si te cuesta mucho trabajo incluir en el SELECT el cálculo, entonces CREAS UNA VISTA... las vistas si permiten tener campos calculados. Checa este ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> CREATE TABLE tabla(cantidad1 INT, cantidad2 INT);
Query OK, 0 rows affected (0.26 sec)
 
mysql> CREATE VIEW vista_tabla AS (SELECT cantidad1,
    ->                                    cantidad2,
    ->                                    (cantidad1*cantidad2) total
    ->                             FROM tabla);
Query OK, 0 rows affected (0.02 sec)
 
mysql> INSERT INTO tabla VALUES (1, 2), (4, 6), (3, 9);
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM tabla;
+-----------+-----------+
| cantidad1 | cantidad2 |
+-----------+-----------+
|         1 |         2 |
|         4 |         6 |
|         3 |         9 |
+-----------+-----------+
3 rows in set (0.00 sec)

Para obtener la columna que quieres, puedes hacerlo desde el SELECT... (esto es lo más recomendable)
1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT cantidad1,
    ->        cantidad2,
    ->        (cantidad1*cantidad2) total
    -> FROM tabla;
+-----------+-----------+-------+
| cantidad1 | cantidad2 | total |
+-----------+-----------+-------+
|         1 |         2 |     2 |
|         4 |         6 |    24 |
|         3 |         9 |    27 |
+-----------+-----------+-------+
3 rows in set (0.00 sec)

O en su defecto, haces un SELECT hacia la vista que creaste:

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM vista_tabla;
+-----------+-----------+-------+
| cantidad1 | cantidad2 | total |
+-----------+-----------+-------+
|         1 |         2 |     2 |
|         4 |         6 |    24 |
|         3 |         9 |    27 |
+-----------+-----------+-------+
3 rows in set (0.00 sec)

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
sin imagen de perfil
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Ayuda con el uso CAST en MySQL

Publicado por Rafael (97 intervenciones) el 24/06/2015 09:05:22
Hola:

El tipo de dato es ANTES que el calculo...

1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `PRUEBA` (
`CANT` int DEFAULT NULL,
`DESCU` decimal(7,2) DEFAULT NULL,
`CANTDESC` decimal(7,1) AS (`CANT` * `DESCU`) ,
`TOTCANTDESC` INT AS (`CANT` - (`CANT` * `DESCU`))
)
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
sin imagen de perfil

Ayuda con el uso CAST en MySQL

Publicado por Josue (4 intervenciones) el 25/06/2015 18:17:18

Hola, gracias por sus respuestas

Tengo una tabla FACTURA la cual funciona correctamente, lo que quiero hacer en esta tabla es que el procedimiento del calculo continúe como entero y no como decimal a partir del campo sombreado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE IF NOT EXISTS `FACTURA` (
  `CODIGO` int(3) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `NUMFAC` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `FECHAFAC` varchar(20) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
  `SENORES` varchar(150) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
  `DIRECCION` varchar(300) CHARACTER SET utf8 COLLATE utf8_spanish2_ci DEFAULT NULL,
  `RUC` varchar(15) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
  `DESCRIPCION` varchar(500) CHARACTER SET utf8 COLLATE utf8_spanish2_ci DEFAULT NULL,
  `CANT` int(10) DEFAULT NULL,
  `DESCU` decimal(7,2) DEFAULT NULL,
  `CANTDESC` decimal(7,1) AS (`CANT` * `DESCU`) VIRTUAL,
  `TOTCANTDESC` int(11) AS (`CANT` - (`CANT` * `DESCU`)) VIRTUAL,
  `PUNIT` decimal(7,2) DEFAULT NULL,
  `IMPORTE` decimal(7,2) AS ((`CANT` - (`CANT` * `DESCU`)) * `PUNIT`) VIRTUAL,
  `SUBTOTAL` decimal(7,2) AS ((`CANT` - (`CANT` * `DESCU`)) * `PUNIT`) VIRTUAL,
  `IGV` decimal(7,2) AS (((`CANT` - (`CANT` * `DESCU`)) * `PUNIT`) * 0.18) VIRTUAL,
  `TOTAL` decimal(7,2) AS (((`CANT` - (`CANT` * `DESCU`)) * `PUNIT`) + (((`CANT` - (`CANT` * `DESCU`)) * `PUNIT`) * 0.18)) VIRTUAL,
  `GUIA` varchar(20) CHARACTER SET utf8 COLLATE utf8_spanish2_ci DEFAULT NULL,
  `OBSERVACIONES` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish2_ci DEFAULT NULL,
  PRIMARY KEY (`CODIGO`),
  UNIQUE KEY `NUMFAC` (`NUMFAC`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;


En el script ANTERIOR en el campo sombreado al usar INT, estoy forzando convertir el resultado decimal a un entero (este redondea el resultado decimal al ENTERO mas cercano, pero solo lo hace para la vista SELECT, mas no para el siguiente el calculo) quiero que el siguiente campo continúe calculando pero con el redondeo del resultado del campo resaltado.

Se que eso va en el calculo pero no se como debería ir

Un ejemplo mas claro con este SCRIPT


1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `PRUEBA` (
`CANT` int DEFAULT NULL,
  `DESCU` decimal(7,2) DEFAULT NULL,
  `CANTDESC` decimal(7,1) AS (`CANT` * `DESCU`) ,
  `TOTCANTDESC` INT (`CANT` - (`CANT` * `DESCU`))  <-- Campo calculado decimal que quiero convertir a entero
)
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