将 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;
我目前有一个具有以下格式的数据库:
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;