将MYSQL数据库的行转换为列

时间:2015-06-24 01:50:05

标签: php mysql pivot-table

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

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也必须更新。如果有办法实现自动化,那就更好了。

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合执行此操作:

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;
相关问题