Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: bgnumis en 16 Noviembre 2015, 08:57 am



Título: Tabla de doble entrada
Publicado por: bgnumis en 16 Noviembre 2015, 08:57 am
Hola a todos,

Tengo una tabla que tiene PRovincias, Funciones, Fecha, idregistro.

Me gustaría hacer una tabla donde no sólo le marque por GROUP BY por filas sino también por columnas, de campos diferentes utilizando COUNT ¿Esto podría ser? ¿Como se haría?

Por ejemplo sería en la Filas agrupar por provincias y en las columnas por funciones (utilizando el COUNT) ¿Cómo se habría una tabla así, si es que se puede?



Título: Re: Tabla de doble entrada
Publicado por: bgnumis en 16 Noviembre 2015, 21:10 pm
Hola he leido pero no acabo de ver como que se puede utilizar PIVOT pero no veo como.

Tabla1

Valencia Maestro 12
Valencia Medico 4
Alicante Enfermera 6
Alicante Cocinera 2
Valencia Enfermera 8
Alicante Maestro 2
Valencia Maestro 4



Resultado
            Maestro Medico Enfermera Cocinera Total
Valencia  2       1            1           0            4
Alicante   1       0              1          1             3
Total       2       1             2            1            7

Por ejemplo yo tengo una tabla Tabla1 que tiene las provincias y funciones y quiero que me cuente cuantos idregistro hay por filas  serian las provincias y por columnas las funciones. ¿Como se añadiría una fila de totales tanto por columnas como por filas?

A ver si me podeis ayudar habia planteado fatal la pregunta


Título: Re: Tabla de doble entrada
Publicado por: gAb1 en 17 Noviembre 2015, 11:12 am
Contar en MySQL es muy facil:

Código
  1. SELECT COUNT(idregistro) FROM tabla WHERE provincias = ?

y lo mismo para las funciones:

Código
  1. SELECT COUNT(idregistro) FROM tabla WHERE funciones = ?

y para los totales:

Código
  1. SELECT COUNT(idregistro) FROM tabla

Simplemente añade la condición WHERE y AND para la segunda condición, por ejemplo si quieres contar cuantos maestros hay en valencia:

Código
  1. SELECT COUNT(idregistro) FROM tabla WHERE funciones = ? AND provincias = ?


Título: Re: Tabla de doble entrada
Publicado por: bgnumis en 17 Noviembre 2015, 16:54 pm
Hola muchas Gracias,

Lo de contar lo tengo claro. Lo único que quiero tengo duda es cómo hacer una tabla que por filas me agrupe por PRovincias y por columnas por Funciones, sin tener que definirlas (se que debiera implicar group by y count que para que me lo saque por filas sé hacerlo, la dificultad es que me agrupe además también por columnas por "funciones". Este es el ejemplo de lo que quiero, tampoco sabría como sacarlo con echo? en php

Tabla1

Valencia Maestro 12
Valencia Medico 4
Alicante Enfermera 6
Alicante Cocinera 2
Valencia Enfermera 8
Alicante Maestro 2
Valencia Maestro 4



Resultado
            Maestro Medico Enfermera Cocinera Total
Valencia  2       1            1           0            4
Alicante   1       0              1          1             3
Total       2       1             2            1            7


A ver si me puedes ayudar.


Título: Re: Tabla de doble entrada
Publicado por: 0roch1 en 17 Noviembre 2015, 17:21 pm
El número delante de la función qué significa?
Citar
Valencia Maestro 12

Coloca un ejemplo claro, todos los campos que tienes en la tabla, el resultado que esperas con valores reales.


Título: Re: Tabla de doble entrada
Publicado por: bgnumis en 17 Noviembre 2015, 19:09 pm
Hola el ejemplo más claro es este, el número es un id, conteo idregistro porque sé que nunca será nulo:

Tabla1 (sus campos son: Provincia, Función, idregistro)

Valencia Maestro 12
Valencia Medico 4
Alicante Enfermera 6
Alicante Cocinera 2
Valencia Enfermera 8
Alicante Maestro 2
Valencia Maestro 4



Resultado
            Maestro Medico Enfermera Cocinera Total
Valencia  2       1            1           0            4
Alicante   1       0              1          1             3
Total       2       1             2            1            7


El tema sería utilizando GROUP BY y count que me sacara el conteo por filas provincias, por columnas las funciones.

Espero haberme expresado mejor.

Muchas Gracias por adelantado.


Título: Re: Tabla de doble entrada
Publicado por: 0roch1 en 17 Noviembre 2015, 19:39 pm
Esto es lo que necesitas?.

Código
  1. SELECT DISTINCT(A.Provincia), B.Maestro, B.Medico, B.Total FROM Tabla1 AS A
  2. LEFT JOIN (
  3. SELECT Provincia,
  4. COUNT(CASE WHEN Funcion='Maestro' THEN 1 ELSE NULL END) AS Maestro,
  5. COUNT(CASE WHEN Funcion='Medico' THEN 1 ELSE NULL END) AS Medico,
  6. COUNT(*) AS Total
  7. FROM Tabla1 GROUP BY Provincia
  8. ) AS B ON A.Provincia=B.Provincia
  9.  


Título: Re: Tabla de doble entrada
Publicado por: bgnumis en 17 Noviembre 2015, 19:43 pm
Esto sí  creo que me vale cuando llegue a casa lo pruebo pero me obliga a saber todos los posibles valores de PRovincia y Función. Yo quería que el solo lo obtuviese, que es lo que hace GROUP BY, pero no sólo por filas sino también por columnnas. Muchas Gracias.  Aunque pensándolo también quizá valga hacer un distinct por funciones, le pegaré una vuelta.


Título: Re: Tabla de doble entrada
Publicado por: bgnumis en 17 Noviembre 2015, 20:05 pm
Me vale, tengo dos dudas:

Me saca los totales de todo ¿Cómo podría decir que me saque sólo los de maestro y médico?

Me saca los totales por filas, ¿Cómo pedirle por columnas?

¿Ejecuto la sentencia en phpmyadmin y me sale una tabla. ¿Cómo podría mostrar en php esa tabla con php? ¿Con echo?

A ver si me puedes ayudar.


Título: Re: Tabla de doble entrada
Publicado por: bgnumis en 17 Noviembre 2015, 21:34 pm
Please heeelllppppp


Título: Re: Tabla de doble entrada
Publicado por: gAb1 en 17 Noviembre 2015, 22:16 pm
Es muy facil :)

Solo los de maestro y médico:

Código
  1. SELECT DISTINCT(A.Provincia), B.Maestro, B.Medico FROM tabla1 AS A
  2. LEFT JOIN (
  3. SELECT Provincia,
  4. COUNT(CASE WHEN Funcion='Maestro' THEN 1 ELSE NULL END) AS Maestro,
  5. COUNT(CASE WHEN Funcion='Medico' THEN 1 ELSE NULL END) AS Medico
  6. FROM tabla1 GROUP BY Provincia
  7. ) AS B ON A.Provincia=B.Provincia
  8.  

Por columnas

Código
  1. SELECT DISTINCT(A.Funcion), B.Valencia, B.Alicante FROM tabla1 AS A
  2. LEFT JOIN (
  3. SELECT Funcion,
  4. COUNT(CASE WHEN Provincia='Valencia' THEN 1 ELSE NULL END) AS Valencia,
  5. COUNT(CASE WHEN Provincia='Alicante' THEN 1 ELSE NULL END) AS Alicante
  6. FROM tabla1 GROUP BY Funcion
  7. ) AS B ON A.Funcion=B.Funcion

Añade los demás igual que los dos ejemplos que tienes.

Para hacerlo en php tienes que hacer una consulta (como te dije antes en tu otro mensaje, con mysqli).

Normalmente si buscas un poco en google verás que la mayoria de las preguntas que tienes ya han sido respondidas miles de veces :) http://stackoverflow.com/a/10201105/4067132

Edito: error al copiar y pegar