2012-08-31 8 views
6

He leído la mayoría de las publicaciones en stackoverflow sobre cómo hacer una tabla dinámica, pero todas las publicaciones muestran ejemplos con conocimiento previo de las columnas. ¿Cómo construyes una consulta si no tienes conocimiento de lo que serán las columnas? es aquí algunos datos de ejemplo:Cómo hacer tabla dinámica sin conocimiento de las columnas

id  column  value  Row 
1  age   13   1 
2  height  55   1 
3  fav number NULL  1 
4  siblings  4   1 
5  age   55   2 
6  height  54   2 
7  fav number 12   2 

Busco a esta salida:

row  age  height  fav number  siblings 
1   13  55   NULL    4 
2   55  54   12    NULL 

Como se puede ver, no hay fila 2 no se encuentra una entrada para los hermanos. Los nombres de las columnas son desconocidos en el momento de la consulta. ¿Cómo harías esta consulta?

+2

¿cómo planeas * usar * un conjunto de resultados con columnas desconocidas? – SingleNegationElimination

+0

Querido Señor, ¿es esto un ... META DB ??? (música malvada: ta ta taaaaaaa) –

+0

@Adrian Me encantan las bases de datos meta :) – Kermit

Respuesta

2

No veo ninguna manera de escribir una consulta SELECTA elegante para obtener lo que desea. Tendrás que hacer un preprocesamiento.


tienes que estar que ejecuta esta consulta MySQL desde algún tipo de programa, la aplicación, la escritura, etc. No estoy seguro de lo que el lenguaje es, pero esto es lo que yo haría en PHP:

/* $data is where our data is going to be stored in our desired format */ 
$data = array(); 
/* $columns is a list of all column names */ 
$columns = array(); 
/* $rows is a list of all row names (probably '1', '2', etc) */ 
$rows = array(); 

$result = mysql_query('SELECT column, value, row FROM TableName'); 
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 
    /* if this row isn't in $data yet, add it */ 
    if (!array_key_exists($row['row'], $data) { 
    $data[$row['row']] = array(); 
    } 

    /* if this column isn't in $columns yet, add it */ 
    if (!in_array($row['column'], $columns)) { 
    array_push($columns, $row['column']); 
    } 

    /* if this row isn't in $rows yet, add it */ 
    if (!in_array($row['row'], $rows)) { 
    array_push($rows, $row['row']); 
    } 

    /* set the actual value in our multi-dimensional array $data */ 
    $data[$row['row']][$row['column']] = $row['value']; 
} 
/* free the result (php specific thing) */ 
mysql_free_result($result); 

/* if we didn't set anything (row, column) pairs, set it to null in $data */ 
foreach ($rows as $r) { 
    foreach ($columns as $c) { 
    if (!array_key_exists($c, $data[$r])) { 
     $data[$r][$c] = null; 
    } 
    } 
} 

Esto colocará todos los datos en el formato que desee en una matriz en PHP.


Por ejemplo, después de ejecutar este algoritmo en los datos de la muestra ya ha introducido, que sería capaz de hacer:

echo $data['2']['age']; // $data['row']['column'] 

lo que la salida 55.


o si su base de datos no se actualiza en tiempo real (tiene un montón de datos que le gustaría reformatear una vez, en lugar de continuamente), puede extender el guión anterior para tener también "CREAR TABLA", "INSERTAR EN" consultas tha t básicamente recrear la tabla en el formato que estás buscando.

Además, si RECIBE datos en tiempo real, puede escribir la secuencia de comandos descrita anteriormente, pero solo querría eliminar las filas de la tabla original mientras las procesaba, y luego ejecutar la secuencia de comandos siempre que los datos se está poniendo en la mesa original.

2

Dudo que pueda hacer esto en MySQL o PostgreSQL como espera, sin embargo hay una alternativa que he usado donde los datos son muy libres. Nuestro caso de uso es "atributos que los elementos del menú devuelven a la aplicación" y, por supuesto, no tenemos conocimiento de estos en la consulta. Pero no puedes crear una tabla dinámica simple.

La razón por la que no se puede es que PostgreSQL requiera que la estructura de la tupla vuelva a estar definida de antemano. No todos los DB lo hacen (Informix, por ejemplo, permite que diferentes filas tengan estructuras diferentes) pero la mayoría lo hace.

Nuestro enfoque es solo PostgreSQL. Sin embargo, tal vez con algunos ajustes puede encontrar un equivalente de MySQL en alguna parte.Lo que hicimos sería básicamente en su versión:

select row, array_agg("column" || '=' || "value") from sample_data group by row; 

Esto produce una salida como:

1 {"age=3","height=55",null,"siblings=4"} 
2 {"age=55","height=54","favorite_number=12"} 

Incluso puede deshacerse de los nulos por:

select row, array_agg("column" || '=' || "value") 
WHERE value is not null 
GROUP BY row; 

A continuación, se obtiene algo como:

1 {"age=3","height=55","siblings=4"} 
2 {"age=55","height=54","favorite_number=12"} 

Sin embargo, no sé cómo hacer lo mismo en MySQL.

Cuestiones relacionadas