mysql - 如何在不了解列的情况下做数据透视表

标签 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

我正在寻找这个输出:

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

如您所见,第 2 行没有缺少 sibling 的条目。列名在查询时是未知的。您将如何进行此查询。

最佳答案

我看不出有什么方法可以让您只编写一些花哨的 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;
    }
  }
}

这会将所有数据放入 PHP 数组中您想要的格式。


例如,在您上面提供的示例数据上运行此算法后,您将能够:

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

这将输出 55​​。


或者如果你的数据库没有实时更新(你有一堆数据你想重新格式化一次,而不是连续格式化),你可以扩展上面的脚本来也有一些“CREATE TABLE” , "INSERT INTO"查询基本上以您要查找的格式重新创建表。

此外,如果您正在实时接收数据,您仍然可以编写上述脚本,但您只想在处理它们时从原始表中删除行,然后在数据出现时运行脚本被放入原始表中。

关于mysql - 如何在不了解列的情况下做数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222016/

相关文章:

MySQL 从 Solr 数据导入处理程序插入

android - 按联系人分组查询最新短信

PHP + MySQL 查询 -> 这个 SQL 有什么问题(短)

sql - 在 SQL 中清理 IPv4 点分四组地址

sql - Postgres 忽略时间戳索引,为什么?

mysql - SQL 从左表中获取每个条目之一,并将右表中的存在性视为 bool 值

Mysql 5.7 无法创建 unix socket 锁定文件

sql - 如何在 PostgreSQL 中转置列和行(即如何切换行和列)?

mysql - 如果没有找到结果设置默认值

mysql - SQL Where 子句中的 If/Else