SQL - Ayuda subconsultas

 
Vista:
sin imagen de perfil

Ayuda subconsultas

Publicado por Monica (1 intervención) el 02/02/2018 14:07:19
Hola! tengo una Tabla con : eventdate,usuario, pais y fecha (donde fecha es un numero estilo 20170101) , mi idea es hacer un contador de tal forma:

Quiero tener en una columnas los usuarios y en las siguientes columnas: ENERO, FEBRERO, MARZO...etc y hacer un conteo de cuantas veces se ha metido ese usuario cada mes. Entonces estoy intentado poner el numero de veces de cada mes con un SELECT....FROM... pero cuando hago un WHERE PAIS = "ES" AND FECHA BETWEEN 20170101 AND 20170201
No consigo entonces crear otra columna con otra condicion del tipo WHERE FECHA BETWEEN 20170201 AND 20170301

Tambien tengo dudas sobre si seria mejor hacerlo con eventdate que es una fecha del estilo 2017-01-01 00:00:00 , pero no sabria como hacer un condicional con este tipo de estilo.


Gracias de antemano!
Mónica :)
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: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda subconsultas

Publicado por Leonardo Josué (1175 intervenciones) el 02/02/2018 16:11:55
Hola Mónica:

Aquí veo varios detalles en tu consulta, pero vayamos por partes. Primero, no nos dices con qué BD's estás trabajando. Cada DBMS maneja una sintaxis distinta sobre todo con el manejo de fechas, por lo tanto es importante que siempre que publiques una pregunta en el foro nos pongas este dato.

Segundo, ¿de qué tipo de dato es tu columna? Si es un tipo numérico, esto es un error de diseño ya que estás almacenando FECHA y por lo tanto, el tipo de dato TIENE QUE SE FECHA.

Ahora bien, volviendo a tu problema, tienes muchas formas de resolver tu consulta, unas más simples y otras más complicadas, dependiendo de la BD's con la que estás trabajando, pero en particular, veo dos soluciones:

1. HACER SUMAS CONDICIONALES

supongamos que tienes esta tabla:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tu_tabla;
+------+------------+
| id   | fecha      |
+------+------------+
|    1 | 2018-01-01 |
|    2 | 2018-01-05 |
|    3 | 2018-01-30 |
|    4 | 2018-02-01 |
|    5 | 2018-02-05 |
|    6 | 2018-03-05 |
+------+------------+
6 rows in set (0.00 sec)

Entonces, una forma de hacerlo sería con SUMAS CONDICIONALES para cada mes, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT
    ->    EXTRACT(YEAR FROM fecha) ANIO,
    ->    SUM(CASE WHEN fecha BETWEEN '2018-01-01' AND '2018-01-31' THEN 1 ELSE 0 END) ENERO,
    ->    SUM(CASE WHEN fecha BETWEEN '2018-02-01' AND '2018-02-28' THEN 1 ELSE 0 END) FEBRERO,
    ->    SUM(CASE WHEN fecha BETWEEN '2018-03-01' AND '2018-03-31' THEN 1 ELSE 0 END) MARZO
    -> FROM tu_tabla
    -> GROUP BY
    ->    EXTRACT(YEAR FROM fecha);
+------+-------+---------+-------+
| ANIO | ENERO | FEBRERO | MARZO |
+------+-------+---------+-------+
| 2018 |     3 |       2 |     1 |
+------+-------+---------+-------+
1 row in set (0.00 sec)

Sin embargo, esta consulta puede ser muy lenta.

2. Usar la función PIVOT, esta función pasa una consulta de "renglones a columnas", de tal suerte que primero agrupas a nivel de registro y después aplicas la función PIVOT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT
    ->    MONTHNAME(fecha),
    ->    COUNT(1) total_mes
    -> FROM tu_tabla
    -> WHERE EXTRACT(YEAR FROM fecha) = 2018
    -> GROUP BY MONTHNAME(fecha)
    -> ORDER BY EXTRACT(MONTH FROM fecha);
+------------------+-----------+
| MONTHNAME(fecha) | total_mes |
+------------------+-----------+
| January          |         3 |
| February         |         2 |
| March            |         1 |
+------------------+-----------+
3 rows in set (0.00 sec)

Esto puede ser más fácil, peor no todos los DBMS's soportan este tipo de consultas:

aquí hay una liga que te puede servir de ejemplo:

https://technet.microsoft.com/es-es/library/ms177410(v=sql.105).aspx

Dale un vistazo y nos comentas.

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