SQL - Obtener la cantidad de informes que tiene con motivo 1 la persona p1 en distintas columnas

 
Vista:

Obtener la cantidad de informes que tiene con motivo 1 la persona p1 en distintas columnas

Publicado por Joaquim (2 intervenciones) el 27/01/2018 15:35:39
Buenas tardes, necesito ayuda para la siguiente consulta, la muestro con un ejemplo
Tengo dos tablas
TABLA Persona, con un solo campo ID y tres registros:
(p1)
(p2)
(p3)

TABLA Informe, con tres campos, ID, Persona, Motivo, y 10 registros
(01, p1, 5)
(02, p1, 3)
(03, p3, 2)
(04, p2, 1)
(05, p1, 4)
(06, p2, 5)
(07, p2, 3)
(08, p3, 5)
(09, p1, 2)
(10, p1, 4)

Necesito una consulta que me diga para la persona p1 en distintas columnas, la cantidad de informes que tiene con motivo 1, la cantidad de informes que tiene con motivo 3, y la cantidad de informes que tiene con motivo 4.
Que quede más o menos así

Persona----Motivo1----Motivo3----Motivo4
---p1-------------1------------0------------ 2-----


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

Obtener la cantidad de informes que tiene con motivo 1 la persona p1 en distintas columnas

Publicado por Leonardo Josué (1173 intervenciones) el 29/01/2018 15:53:40
Hola Joaquim:

No nos dices con qué Base de Datos estás trabajando y así resulta complicado darte una respuesta puntual, sin embargo veamos si esto te puede servir:

Tienes varias formas de obtener lo que quieres, la más "simple" sería con sumas condicionales:

1
2
3
...
SUM(CASE WHEN Motivo = 1 THEN 1 ELSE 0 END) Total_Motivo1
...

Esto funciona como un "Contador" de programación Suma = Suma + 1, es decir, cada vez que encuentre un registro con una condición suma 1 a la cuenta. Si tienes problemas para entender, pregúntale a SAN GOOGLE por algunos ejemplos.

La otra forma sería con PIVOT, primero agrupas tu información en forma de registros así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> SELECT * FROM tabla;
+------+---------+--------+
| id   | persona | motivo |
+------+---------+--------+
|    1 | p1      |      5 |
|    2 | p1      |      3 |
|    3 | p3      |      2 |
|    4 | p2      |      1 |
|    5 | p1      |      4 |
|    6 | p2      |      5 |
|    7 | p2      |      3 |
|    8 | p3      |      5 |
|    9 | p1      |      2 |
|   10 | p1      |      4 |
+------+---------+--------+
10 rows in set (0.00 sec)
 
mysql> SELECT persona, motivo, COUNT(1) total_motivo
    -> FROM tabla
    -> WHERE persona = 'p1' AND motivo IN (1, 3, 4)
    -> GROUP BY persona, motivo;
+---------+--------+--------------+
| persona | motivo | total_motivo |
+---------+--------+--------------+
| p1      |      3 |            1 |
| p1      |      4 |            2 |
+---------+--------+--------------+
2 rows in set (0.00 sec)

Finalmente, la función PIVOT pasa tu consulta de REGISTROS a COLUMNAS, que es como quieres presentar la información. Sin embargo no todos los DBMS's soportan esta función, investiga primero si tu DBMS soporta esta funcionalidad o no, y para más información checa esta liga:

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

Finalmente, lo puedes hacer con subconsultas (aunque esto no es recomendado, ya que tienen un pésimo rendimiento), sería más o menos así:

1
2
3
4
5
6
7
SELECT
  id,
  (SELECT COUNT(*)........ ) --> aquí pones una subconsulta para obtener el total de registros con motivo 1;
  (SELECT COUNT(*)........ ) --> aquí pones una subconsulta para obtener el total de registros con motivo 3;
  (SELECT COUNT(*)........ ) --> aquí pones una subconsulta para obtener el total de registros con motivo 4;
FROM
  tabla;

haz la prueba 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