我想通过分组来分隔项目名称,然后显示详细信息。根据我的代码,它显示了详细信息,但仅显示在一行中。另外我没有求和功能。
输出应该是这样的
Month | Contract Amount | Investment | Expense
Project Name 1
Jan | $9000 | $9000 | $100
Feb | $10000 | $5000 | $500
Total: | $19000 | $14000 | $600
Project Name 2
Jan | $50000 | $2500 | $10000
Feb | $10000 | $5000 | $500
Mar | $20000 | $4500 | $1500
Total: | $80000 | $12000 | $1200
我的源代码。
项目名称是“pn”
<?php
$pdo = Database::connect();
$sql = 'SELECT *, tt_projects.name as pn, tt_projects.id
FROM tt_client_project_binds
INNER JOIN tt_projects
ON tt_client_project_binds.project_id = tt_projects.id
INNER JOIN rms_projects_budget
on rms_projects_budget.project_id = tt_projects.id';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$categories = array();
while (($row = $stmt->fetch(PDO::FETCH_ASSOC)))
{
$category = $row['pn'];
$categories[$category][] = date('F', strtotime($row['month']));
$categories[$category][] = $row['pn'];
$categories[$category][] = $row['Contract_Amount'];
$categories[$category][] = $row['investment'];
$categories[$category][] = $row['expense'];
}
?>
<html>
<body>
<?php
foreach ($categories as $category => $consumption)
{
?>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Month</th>
<th>Contract Amount</th>
<th>Investment</th>
<th>Expense</th>
</tr>
</thead>
<tbody>
<h4><?php echo $category; ?></h4>
<?php
foreach ($consumption as $details)
{
?>
<td><?php echo $details; ?></td>
<?php
}
?>
<?php
}
?>
</body>
</html>
非常感谢您的帮助。预先感谢您!
最佳答案
好吧,这是一个让事情运行的快速技巧,可能有比我的更好的解决方案,但这可行。 xD
PS:我假设表结构与我在 http://rextester.com/PJJML53507 设置的表结构类似。
这是输出:http://rextester.com/HATU87511
<?php
$pdo = Database::connect();
$sql = <<<SQL
SELECT p.name, group_concat('{"month":', pb.month,',"amount":[', pb.contract , ',', pb.investment, ',', pb.expense, ']}') AS detail,
sum(pb.contract) AS sum_contract, sum(pb.investment) as sum_investment, sum(pb.expense) as sum_expense
FROM tt_projects p
INNER JOIN rms_projects_budget pb
ON p.ID = pb.project_id
GROUP BY p.name;
SQL;
$stmt = $pdo->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchall();
// Output - added \n for better viewing, you can remove it.
echo "<table><thead><th></th><th>Month</th><th>Contract Amount</th><th>Investment</th><th>Expense</th></thead>\n";
foreach ($rows as $row) {
echo "<tr><td>" . $row['name'] . "</td><td colspan=4></td></tr>\n";
$details = json_decode('{"detail":[' . $row['detail'] . ']}', true)['detail'];
foreach($details as $detail) {
$month = $detail['month'];
echo "<tr><td></td><td>$month</td><td>" . implode("</td><td>", $detail['amount']) . "</td></tr>\n";
}
echo "<tr><td colspan=2>Total:</td><td>" . $row['sum_contract'] . "</td><td>" . $row['sum_investment'] . "</td><td>" . $row['sum_expense'] . "</td></tr>\n";
}
echo "</table>\n";
?>
该解决方案的想法是将详细费用合并到 JSON 代码中,并让 SQL 代替 PHP 完成大部分工作。
通过使用 json_decode(),您可以立即将月份和金额格式化为各自的数组,一旦完成,您几乎可以做任何您想做的事情。
我还在最后添加了总和列,只是为了懒得不编写另一个变量来存储总和。
关于PHP MYSQL 寻找一种对具有多个详细信息和总计的行进行分组的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45955011/