Luk*_*101 6 mysql sql postgresql pivot
我已经阅读了关于如何进行数据透视表的stackoverflow上的大多数帖子,但是所有帖子都显示了具有列的先验知识的示例.如果您不知道列将是什么,如何构造查询.这是一些示例数据:
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
Run Code Online (Sandbox Code Playgroud)
我正在寻找这个输出:
row age height fav number siblings
1 13 55 NULL 4
2 55 54 12 NULL
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,没有第2行缺少兄弟姐妹的条目.查询时列名称未知.你会如何进行这个查询.
我看不出有什么方法可以只编写一些花哨的 SELECT 查询来获得你想要的东西。您将必须进行一些预处理。
您必须从某种程序、应用程序、脚本等执行此 MySQL 查询。不确定该语言是什么,但这是我在 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会将所有数据以您想要的格式放入 PHP 数组中。
例如,在对您上面提供的示例数据运行此算法后,您将能够执行以下操作:
echo $data['2']['age']; // $data['row']['column']
Run Code Online (Sandbox Code Playgroud)
这将输出 55。
或者,如果您的数据库没有实时更新(您有一堆数据想要重新格式化一次,而不是连续),您可以扩展上面的脚本以也有一些“CREATE TABLE”,“INSERT INTO”查询基本上以您正在寻找的格式重新创建表。
此外,如果您正在实时接收数据,您仍然可以编写上述脚本,但您只想在处理它们时从原始表中删除行,然后在将数据放入其中时运行脚本原来的表。
归档时间: |
|
查看次数: |
1094 次 |
最近记录: |