将 MYSQL 数据库的行转换为列

Converting rows of MYSQL database into columns

我目前有一个具有以下格式的数据库:

ID    |    Year    |    Name    |    Address    |    Penalty
1     |    2015    |   Test 1   |    Test 1     |     0.2 
2     |    2014    |   Test 1   |    Test 1     |     0.3 
3     |    2013    |   Test 1   |    Test 1     |     0.4 
4     |    2015    |   Test 2   |    Test 2     |     0.5 
5     |    2014    |   Test 2   |    Test 2     |     0.6 
6     |    2015    |   Test 3   |    Test 3     |     0.7 

我想做的是编写一个查询,该查询将生成类似于此的格式:

ID    |    Name    |    Address    |    2015Penalty    |    2014Penalty    |    2013Penalty
1     |   Test 1   |    Test 1     |        0.2        |        0.3        |       0.4
2     |   Test 1   |    Test 1     |        0.5        |        0.6        |       0.2
3     |   Test 1   |    Test 1     |        0.7        |        0.8        |       0.3

基本上,我不需要每家公司的每一年都有一行,我需要每家公司一行,然后是每一年的罚款列。

这可以吗?如果可能的话,我想完全在 SQL 中完成,因为这些行基本上会回显到一个页面,它变成了一个 Excel 电子表格:

while($row = mysqli_fetch_assoc($res)) {
    if(!$flag) {
        // display field/column names as first row
        echo implode("\t", array_keys($row)) . "\r\n";
        $flag = true;
    }
    array_walk($row, 'cleanData');
    echo implode("\t", array_values($row)) . "\r\n";
}

我一直在尝试在 PHP 中查看是否有办法做到这一点,但我也不太确定该怎么做,因此非常感谢您的帮助。如果需要进一步说明,请告诉我。

编辑

我可能应该更具体一些,我希望这样可以根据年份自动生成列,因为每年都会导入更多数据,然后必须更新 SQL以及。如果有办法自动化的话就更好了。

您可以使用条件聚合来做到这一点:

select id, name, address,
       max(case when year = 2015 then penalty end) as penalty2015,
       max(case when year = 2014 then penalty end) as penalty2014
from table t
group by id, name, address;