2015-06-24 41 views
1

我现在有一个具有以下格式的数据库:转换MYSQL数据库的行转换成列

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必须,我想它也会更新。如果有办法让这个自动化,那会好很多。

+2

你描述的被称为*旋转*,供您参考。 –

+0

我不知道!对于SQL查询,有点初学者,现在转到谷歌,谢谢。 –

+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; 
+0

如果年份不能保证在那里,这项工作是否会进行?另外,我是否必须为每一个可能的年份编写一个新的'max',或者是否有办法使它自动化? –

+0

@BrandonShega。 。 。事实上,是的。当年不存在时,它会给出'NULL'的值。如果你想要0,你可以添加'else 0'。 –

+0

我在上面编辑了我的问题,道歉,但无论如何它会根据年份生成列标题,而不是每年都创建一个案例? –