Intenté buscar publicaciones, pero solo encontré soluciones para SQL Server / Access. Necesito una solución en MySQL (5.X).
Tengo una tabla (llamada historial) con 3 columnas: hostid, itemname, itemvalue.
Si hago un select ( select * from history
), volverá
+--------+----------+-----------+
| hostid | itemname | itemvalue |
+--------+----------+-----------+
| 1 | A | 10 |
+--------+----------+-----------+
| 1 | B | 3 |
+--------+----------+-----------+
| 2 | A | 9 |
+--------+----------+-----------+
| 2 | c | 40 |
+--------+----------+-----------+
¿Cómo consulto la base de datos para devolver algo como
+--------+------+-----+-----+
| hostid | A | B | C |
+--------+------+-----+-----+
| 1 | 10 | 3 | 0 |
+--------+------+-----+-----+
| 2 | 9 | 0 | 40 |
+--------+------+-----+-----+
Respuestas:
Voy a agregar una explicación un poco más larga y más detallada de los pasos a seguir para resolver este problema. Pido disculpas si es demasiado largo.
Comenzaré con la base que has dado y la usaré para definir un par de términos que usaré para el resto de esta publicación. Esta será la tabla base :
Este será nuestro objetivo, la bonita tabla dinámica :
Los valores en la
history.hostid
columna se convertirán en valores y en la tabla dinámica. Los valores en lahistory.itemname
columna se convertirán en valores x (por razones obvias).Cuando tengo que resolver el problema de crear una tabla dinámica, lo abordo mediante un proceso de tres pasos (con un cuarto paso opcional):
Apliquemos estos pasos a su problema y veamos qué obtenemos:
Paso 1: seleccione columnas de interés . En el resultado deseado,
hostid
proporciona los valores y yitemname
proporciona los valores x .Paso 2: extienda la tabla base con columnas adicionales . Por lo general, necesitamos una columna por valor de x. Recuerde que nuestra columna de valor x es
itemname
:Tenga en cuenta que no cambiamos el número de filas, solo agregamos columnas adicionales. También tenga en cuenta el patrón de
NULL
s: una fila conitemname = "A"
tiene un valor no nulo para la nueva columnaA
y valores nulos para las otras columnas nuevas.Paso 3: agrupe y agregue la tabla extendida . Necesitamos
group by hostid
, ya que proporciona los valores y:(Tenga en cuenta que ahora tenemos una fila por valor de y). Bien, ¡ya casi llegamos! Solo tenemos que deshacernos de esos feos
NULL
.Paso 4: prettify . Simplemente vamos a reemplazar cualquier valor nulo con ceros para que el conjunto de resultados sea más agradable de ver:
Y hemos terminado: hemos creado una tabla dinámica agradable y bonita con MySQL.
Consideraciones al aplicar este procedimiento:
itemvalue
en este ejemploNULL
, pero también podría ser0
o""
, dependiendo de tu situación exactasum
, perocount
ymax
también se utilizan a menudo (max
se utiliza a menudo en la construcción de una sola hilera "objetos" que habían sido repartidos en muchas filas)group by
cláusula (y no se olvide deselect
ellas)Limitaciones conocidas:
fuente
fuente
group by
.MAX
lugar deSUM
porque misitemValue
son cadenas, no valores numéricos.Otra opción, especialmente útil si tiene muchos elementos que necesita pivotar es dejar que mysql construya la consulta por usted:
FIDDLE Se agregaron algunos valores adicionales para verlo funcionar
GROUP_CONCAT
tiene un valor predeterminado de 1000, por lo que si tiene una consulta realmente grande, cambie este parámetro antes de ejecutarloPrueba:
fuente
'ifnull(SUM(case when itemname = ''',
con''' then itemvalue end),0) AS
', `a'SUM(case when itemname = '''
con''' then itemvalue else 0 end) AS ',
. Esto genera términos comoSUM(case when itemname = 'A' then itemvalue else 0 end) AS 'A'
.Aprovechando la idea de Matt Fenwick que me ayudó a resolver el problema (muchas gracias), reduzcamoslo a una sola consulta:
fuente
Edito la respuesta de Agung Sagita de subconsulta para unirme. No estoy seguro de cuánta diferencia entre esta 2 vías, pero solo para otra referencia.
fuente
usar subconsulta
pero será un problema si la subconsulta que resulta en más de una fila, utiliza una función agregada adicional en la subconsulta
fuente
Mi solución :
Produce los resultados esperados en el caso presentado.
fuente
Hago eso y
Group By hostId
luego mostrará solo la primera fila con valores,como:
fuente
Descubro una forma de hacer que mis informes conviertan filas en columnas casi dinámicas mediante consultas simples. Puedes verlo y probarlo en línea aquí .
El número de columnas de consulta es fijo, pero los valores son dinámicos y se basan en valores de filas. Puede compilarlo Entonces, utilizo una consulta para compilar el encabezado de la tabla y otra para ver los valores:
También puedes resumirlo:
Resultados de RexTester :
http://rextester.com/ZSWKS28923
Para un ejemplo real de uso, este informe muestra en columnas las horas de salida y arribo de un bote / autobús con un horario visual. Verá una columna adicional que no se utilizó en la última columna sin confundir la visualización: ** sistema de venta de boletos para vender boletos en línea y presenciales
fuente
Si pudieras usar MariaDB, hay una solución muy fácil.
Desde MariaDB-10.02 se ha agregado un nuevo motor de almacenamiento llamado CONNECT que puede ayudarnos a convertir los resultados de otra consulta o tabla en una tabla dinámica, tal como lo desea: puede echar un vistazo a los documentos .
En primer lugar, instale el motor de almacenamiento Connect .
Ahora la columna dinámica de nuestra tabla es
itemname
y los datos de cada elemento se encuentran en laitemvalue
columna, por lo que podemos obtener la tabla dinámica de resultados utilizando esta consulta:Ahora podemos seleccionar lo que queremos de
pivot_table
:Más detalles aquí
fuente
Esta no es la respuesta exacta que está buscando, pero fue una solución que necesitaba en mi proyecto y espero que esto ayude a alguien. Esto enumerará de 1 a n elementos de fila separados por comas. Group_Concat lo hace posible en MySQL.
Este cementerio tiene dos nombres comunes, por lo que los nombres se enumeran en diferentes filas conectadas por una sola identificación pero dos identificadores de nombre y la consulta produce algo como esto
CemeteryID Cemetery_Name Latitude
1 Appleton, Sulpher Springs 35.4276242832293
fuente
Lamento decir esto y tal vez no estoy resolviendo su problema exactamente, pero PostgreSQL es 10 años mayor que MySQL y es extremadamente avanzado en comparación con MySQL y hay muchas maneras de lograrlo fácilmente. Instala PostgreSQL y ejecuta esta consulta
entonces voila! Y aquí hay una extensa documentación: PostgreSQL: Documentación: 9.1: tablefunc o esta consulta
entonces otra vez voila! PostgreSQL: Documentación: 9.0: hstore
fuente