1

我使用下面的 DYNAMIC SQL SCRIPT 来转换表

(1,AttributeName1,Attributevalue1)
(1,AttributeName2,Attributevalue2)
(2,AttributeName1,Attributevalue1)
(2,AttributeName2,Attributevalue2)

.
.
(11113,属性名称2,属性值2)

将表格转换为以下格式

(Datapoint,AttributeName1,AttributeName2,............AttributeNamen)
(1,AttributeValue1,AttributeValue2,............ ....)
(2,AttributeValue1,AttributeValue2,........)

.
.
(11113,属性值1,属性值2,............)

==============动态 SQL 脚本=================

SET @sql = NULL;<br/>
SELECT<br/>
  GROUP_CONCAT(DISTINCT<br/>
    CONCAT(<br/>
      'max(CASE WHEN AttributeName = ''',<br/>
      AttributeName,<br/>
      ''' THEN AttributeValue END) AS `',
      AttributeName, '`'<br/>
    )<br/>
  ) INTO @sql<br/>
FROM yourtable;<br/>
<br/>

SET @sql <br/>
  = CONCAT('SELECT datapoint, ', @sql, ' <br/>
           from yourtable<br/>
           group by datapoint');<br/>

PREPARE stmt FROM @sql;<br/>
EXECUTE stmt;<br/>
DEALLOCATE PREPARE stmt;<br/>

问题:我的 SQL 列数限制用完了。我知道我必须使用 SPARSE 列(因为我的表有很多 NULL 值)。

知道如何在上面的 SQL 脚本中使用 SPARSE 列吗?

4

1 回答 1

0

在这种情况下,我建议获取所有在数据库中组织的数据,并将结果后处理到 PHP 哈希数组中。这是一个伪代码示例,但我不知道您使用的是哪个 PHP API for MySQL:

$sql = "SELECT datapoint, AttributeName, AttributeValue FROM yourtable";

/* execute $sql */

$data = array();
while (/* $row = fetch one row */) {
  $data[$row["datapoint"]][$row["AttributeName"]] = $row["AttributeValue"];
}

现在你有一个用于稀疏数据的散列数组数组 $data。


回复您的评论:

好吧,够公平的。如果您只想在 MySQL 中执行此操作,那么我上面的建议是不相关的。

您可能遇到了 GROUP_CONCAT() 生成的字符串长度的限制。group-concat 字符串的默认限制是 1024 字节。您的列是长表达式,每个至少有字符。因此,一个组连接字符串中最多可以有 15 个这样的表达式。

该 group-concat 字符串长度限制可以通过变量group_concat_max_len. 您最多可以将其配置为 2 32 -1 或 2 64 -1 字节。

mysql> SET group_concat_max_len = 1024*1024*1024; /* 1GB */
mysql> SELECT GROUP_CONCAT(...) ... INTO @sql;

然后,当您将该 @sql 字符串准备到查询中时,它将有很多列,但 IIRC 查询中列的限制为 4096。如果您超过了,我会感到惊讶。

于 2013-04-23T20:55:02.087 回答