MySQL - Sumar rango de columnas con nombre de fecha

 
Vista:
sin imagen de perfil
Val: 4
Ha aumentado su posición en 12 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Sumar rango de columnas con nombre de fecha

Publicado por Esteban (3 intervenciones) el 12/02/2019 18:21:15
Hola a todos. Tengo una tabla en MySQL, esta tabla se parece al excel que adjunto. El nombre de cada columna corresponde a un día del año en formato de fecha, en total son 365 columnas + 1 que es la del ID. El ID es un número consecutivo, son 2,000 filas.

Necesito sumar por rango de fechas y por ID, ejemplo:
la suma desde 2019-01-01 hasta 2019-03-05 del ID 5, el total es 96,032.
Este 96,032 es lo que necesito.

Por favor, ojalá me pudieran orientar en cómo hacerlo, posiblemente tenga que cambiar la estructura de la tabla y poner las fechas como filas y tener 2,000 columnas. Sin embargo es posible que se carguen más registros y ya no sean 2,000 sino más.

Mi tabla se ve asi:
CREATE TABLE IF NOT EXISTS `nombre_base`.`montos_diarios` (
`id_base_general` INT(6) NOT NULL AUTO_INCREMENT,
`2019-01-01` DECIMAL(20,5) DEFAULT 0.00,
`2019-01-02` DECIMAL(20,5) DEFAULT 0.00,
`2019-01-03` DECIMAL(20,5) DEFAULT 0.00,
`2019-01-04` DECIMAL(20,5) DEFAULT 0.00,
`2019-01-05` DECIMAL(20,5) DEFAULT 0.00,
etc,etc,etc
`2019-12-30` DECIMAL(20,5) DEFAULT 0.00,
`2019-12-31` DECIMAL(20,5) DEFAULT 0.00,
PRIMARY KEY (`id_base_general`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

Muchas gracias.
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

Sumar rango de columnas con nombre de fecha

Publicado por leonardo_josue (414 intervenciones) el 13/02/2019 23:23:29
Hola Esteban:

1
2
3
posiblemente tenga que cambiar la estructura de la tabla y poner las fechas como filas y
tener 2,000 columnas. Sin embargo es posible que se carguen más registros
y ya no sean 2,000 sino más.

analizando tu tabla, creo que estás equivocando la estrategia... por de ejemplo, para estos datos:

1
2
3
4
5
6
ID	2019-01-01	2019-01-02	2019-01-03
1   1100        1101        1100
2   1200        1201        1200
3   1300        1301        1300
4   1400        1401        1400
5   1500        1501        1500

en lugar de almacenarlos asi, podrías optar por tener una tabla más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select * from tabla;
+------+------+------------+-------+
| id   | fila | fecha      | valor |
+------+------+------------+-------+
|    1 |    1 | 2019-01-01 |  1100 |
|    2 |    2 | 2019-01-01 |  1200 |
|    3 |    3 | 2019-01-01 |  1300 |
|    4 |    4 | 2019-01-01 |  1400 |
|    5 |    5 | 2019-01-01 |  1500 |
|    6 |    1 | 2019-01-02 |  1101 |
|    7 |    2 | 2019-01-02 |  1201 |
|    8 |    3 | 2019-01-02 |  1301 |
|    9 |    4 | 2019-01-02 |  1401 |
|   10 |    5 | 2019-01-02 |  1501 |
|   11 |    1 | 2019-01-03 |  1100 |
|   12 |    2 | 2019-01-03 |  1200 |
|   13 |    3 | 2019-01-03 |  1300 |
|   14 |    4 | 2019-01-03 |  1400 |
|   15 |    5 | 2019-01-03 |  1500 |
+------+------+------------+-------+
15 rows in set (0.05 sec)

De esta manera no importa si tienes que agregar más "registros", y al tener tu información como campo y no cadena entonces si puedes hacer operaciones y/o cálculos sobre los mismos...

Si puedes cambiar tu modelo, hazlo, de lo contrario te comento lo siguiente. Para hacer lo que quieres no hay una forma "directa" de hacerlo, ya que los filtros no los puedes hacer sobre nombre de columnas... Se me ocurre que uses dos cosas: Procedimientos Almacenados y Sentencias Preparadas...

Al usar procedimientos almacenados, tendrás acceso a ciclos iterativos, como FOR o WHILE y con las Sentencias Preparadas podrías armar tu SQL tal como lo necesites.

Pero insisto, esto no me parece nada práctico.

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