PHP MYSQL 寻找一种对具有多个详细信息和总计的行进行分组的方法

标签 php mysql sql datatables grouping

我想通过分组来分隔项目名称,然后显示详细信息。根据我的代码,它显示了详细信息,但仅显示在一行中。另外我没有求和功能。

输出应该是这样的

                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/

相关文章:

php - Google网上论坛替代品

php - 使用 PHP API 插入 MySQL 数据库

php - Magento - 通知 : Undefined index: in ConfigurableSwatches/Helper/Productimg. php

php - 数据库关系 - Laravel

php - SPARQL 查询以获取节点的所有父节点

SQL Management Studio 设置(静默安装)

mysql - Laravel 4 独家事务更新和选择

php - 如何使用 MySQL MATCH AGAINST IN BOOLEAN MODE 返回关键字字符串中至少 1 个匹配关键字的结果?

mysql - 需要创建这个触发器

mysql - 查找并返回前员工但不是现任员工