繁体   English   中英

MySQL动态透视和分组

[英]Mysql dynamic pivoting and groupoing

昨天跟进我的问题

我有一张桌子1

Remark    Name  Points
----------------------
Cameroon  SS    10
Cameroon  JL    10
NZ        JL    30

我想显示为

       NZ   Cameroon
---------------------
 JL    10      10
 SS     0      30

备注中table1的条目是动态的,将添加更多。

我在Php中尝试的是

$query_get = "SELECT DISTINCT remark FROM table1";
$result =  mysql_query($query_get) or die(mysql_error());
$remarks ='';
while ($row = mysql_fetch_array( $result )) {
$remarks .= ",SUM( IF( remark={$row[0]}, 1, 0 ) ) as {$row[0]} ";
};


$query = "SELECT name, .$eventcodes. FROM jr_event_points";
$result1 = mysql_query($query) or die(mysql_error());

现在错误来自查询。 动态列汇总后,应该如何进行第二次查询?

您可以使用动态SQL在MySQL方面做到这一点

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT CONCAT('COALESCE(SUM(CASE WHEN remark = ''', 
                                    remark, 
                                    ''' THEN points END), 0) `',
                                    remark,
                                    '`'))
  INTO @sql
  FROM table1;

SET @sql = CONCAT('SELECT name, ', @sql, ' FROM table1 GROUP BY name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

输出:

| NAME | CAMEROON | NZ |
|------|----------|----|
|   JL |       10 | 30 |
|   SS |       10 |  0 |

这是SQLFiddle演示


如果我想用php做,有可能吗?

$sql = "
SELECT GROUP_CONCAT(DISTINCT CONCAT('COALESCE(SUM(CASE WHEN remark = ''', 
                                    remark, 
                                    ''' THEN points END), 0) `',
                                    remark,
                                    '`')) columns
  FROM table1";
$result = mysql_query($sql);
if (!$result) {
    die ('Error: ' . mysql_error()); //TODO: better error handling
}
$row = mysql_fetch_assoc($result);
$sql = "SELECT name, {$row['columns']} FROM table1 GROUP BY name";
$result = mysql_query($sql);
if (!$result) {
    die ('Error: ' . mysql_error()); //TODO: better error handling
}
$row = mysql_fetch_assoc($result);
echo '| '. implode(' | ', array_keys($row)) . ' |' . PHP_EOL;
echo '| '. implode(' | ', array_values($row)) . ' |' . PHP_EOL;
while ($row = mysql_fetch_assoc($result)) {
    echo '| '. implode(' | ', array_values($row)) . ' |' . PHP_EOL;
}

输出:

| name | Cameroon | NZ |
| JL | 10 | 30 |
| SS | 10 | 0 |

注意:请考虑从mysql_*切换到mysqli_*PDO因为自PHP 5.5.0起不推荐使用此扩展,以后将删除该扩展。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM