在PHP和MySql中创建累积比较表

在PHP和MySql中创建累积比较表,php,html,mysql,arrays,loops,Php,Html,Mysql,Arrays,Loops,我有一个名为payments的数据库表,其中包含日期、金额字段。我想从amount字段中获取值,按日期汇总所有金额,并将结果放入html表,然后像在图像上一样输出它们 我已经动态地创建了日期,这样无论哪个月,例如1月1-31日和2月1-31日,它们都是相等的。如果有周末或日期无效,我希望值为零。我想要的是这张桌子[桌子][1][1]: 这就是我得到的[输出][1][1]: ******注****我认为我的解决方案不是解决我问题的最佳方案。如果可能的话,只需查看我想要的图片,并为我找到最佳解决方案

我有一个名为payments的数据库表,其中包含日期、金额字段。我想从amount字段中获取值,按日期汇总所有金额,并将结果放入html表,然后像在图像上一样输出它们

我已经动态地创建了日期,这样无论哪个月,例如1月1-31日和2月1-31日,它们都是相等的。如果有周末或日期无效,我希望值为零。我想要的是这张桌子[桌子][1][1]:

这就是我得到的[输出][1][1]:

******注****我认为我的解决方案不是解决我问题的最佳方案。如果可能的话,只需查看我想要的图片,并为我找到最佳解决方案。我希望在实现它的步骤或解决方案中得到帮助

我知道我正在使用一个去润滑的mysql synthax,请忽略这一点,并帮助解决我的问题

<table border="1" align="center">
  <?php
    session_start();
    include("connection/db_con.php");
    $sym='-';
    $d=array();
    ///Insert values of month for period selected into an array
    $a = $_POST['dat'];
    $b = $_POST['dat2'];
    $mnth=array();
    $m_nam=array();
    $m_nm=array();
    $m_nam[]="Day";
    //////New way of getting months in format Y-m
    $start    = new DateTime($a);
    $start->modify('first day of this month');
    $end      = new DateTime($b);
    $end->modify('first day of next month');
    $interval = DateInterval::createFromDateString('1 month');
    $period   = new DatePeriod($start, $interval, $end);

    foreach ($period as $dt) {
      $mnth[]=$dt->format("Y-m");
      $m_nam[]=date('F-Y', strtotime($dt->format("Y-m")));
      $m_nm[]=date('M', strtotime($dt->format("Y-m")));
    }
    ///////End of New way
    echo "<tr bgcolor='#999999'>";
    foreach ($m_nam as $m)
    {
      echo"<td>".$m."</td>";
    }
    echo"</tr>";
    /////////End insert////////////////////////
    $day=0;
    for($x=1; $x<=31; $x++)
    {
      $day=$day+1;
      echo"<tr>";
      echo"<td>".$day."</td>";
      $d=$sym.$x;

      foreach($mnth as $mon)
      {
        $dat=$mon.$d;

        $qry=mysql_query("SELECT SUM(amount) AS total_disb FROM payments where dat='$dat'")or die(mysql_error());
        $row=mysql_fetch_assoc($qry);
        $sum = $row['total_disb']+0;

        echo"<td>".$sum."</td>";

      }
      echo"</tr>";
    }
  ?>
</table>

您刚刚把日期弄乱了一点,如果我了解您的问题所在,您可以直接从SQL执行,请尝试以下操作:

SELECT SUM(amount) AS total_disb , MONTH(DateTime) , DAY(DateTime)
FROM payments   
GROUP BY DATE(DateTime), DAY(DateTime)
更改变量或列名的日期时间

如果您还想在表的末尾对月份总数求和,我建议您进行如下新查询:

SELECT SUM(amount) AS total_disb , MONTH(DateTime)
FROM payments   
GROUP BY DATE(DateTime), MONTH(DateTime)  
另一种选择是在循环打印值时增加一个变量,但我认为新的查询更简单


如果这不是您需要的,请留下评论,我将对其进行编辑。

您刚刚把日期弄乱了一点,如果我了解您的问题所在,您可以直接从SQL中执行,请尝试以下操作:

SELECT SUM(amount) AS total_disb , MONTH(DateTime) , DAY(DateTime)
FROM payments   
GROUP BY DATE(DateTime), DAY(DateTime)
更改变量或列名的日期时间

如果您还想在表的末尾对月份总数求和,我建议您进行如下新查询:

SELECT SUM(amount) AS total_disb , MONTH(DateTime)
FROM payments   
GROUP BY DATE(DateTime), MONTH(DateTime)  
另一种选择是在循环打印值时增加一个变量,但我认为新的查询更简单


如果这不是您需要的,请留下评论,我将对其进行编辑。

要获得累积值,您必须存储上一个求和结果,并将其添加到循环中的当前迭代中,类似于:

$sumc = array();
foreach($mnth as $mon) {
    $dat = $mon . $d;
    $qry = mysql_query("SELECT SUM(amount) AS total_disb FROM payments where dat='$dat'") or die(mysql_error());
    $row = mysql_fetch_assoc($qry);
    $sum = $row['total_disb'];
    if(isset($sumc[$mon])) {
      $sumc[$mon] = (int)$sum + $sumc[$mon];
    } else {
      $sumc[$mon] = (int)$sum;
    }
    echo "<td>" . $sum . "</td>";
    echo "<td>" . $sumc[$mon] . "</td>";
}
$sumc=array();
foreach($mnth作为$mon){
$dat=$mon.$d;
$qry=mysql\u query(“选择SUM(amount)作为总金额,其中dat='$dat'”)或die(mysql\u error());
$row=mysql\u fetch\u assoc($qry);
$sum=$row['total_disb'];
如果(isset($sumc[$mon])){
$sumc[$mon]=(int)$sum+$sumc[$mon];
}否则{
$sumc[$mon]=(int)$sum;
}
回声“$sum.”;
回显“$sumc[$mon]”;
}
应该行得通


(注意:“每日”和“累计”缺少第二行,一旦有了这一行,就需要使用
colspan
来跨越各个月的列)。参见colspan示例。

要获得累积值,必须存储上一个求和结果并将其添加到循环中的当前迭代中,如下所示:

$sumc = array();
foreach($mnth as $mon) {
    $dat = $mon . $d;
    $qry = mysql_query("SELECT SUM(amount) AS total_disb FROM payments where dat='$dat'") or die(mysql_error());
    $row = mysql_fetch_assoc($qry);
    $sum = $row['total_disb'];
    if(isset($sumc[$mon])) {
      $sumc[$mon] = (int)$sum + $sumc[$mon];
    } else {
      $sumc[$mon] = (int)$sum;
    }
    echo "<td>" . $sum . "</td>";
    echo "<td>" . $sumc[$mon] . "</td>";
}
$sumc=array();
foreach($mnth作为$mon){
$dat=$mon.$d;
$qry=mysql\u query(“选择SUM(amount)作为总金额,其中dat='$dat'”)或die(mysql\u error());
$row=mysql\u fetch\u assoc($qry);
$sum=$row['total_disb'];
如果(isset($sumc[$mon])){
$sumc[$mon]=(int)$sum+$sumc[$mon];
}否则{
$sumc[$mon]=(int)$sum;
}
回声“$sum.”;
回显“$sumc[$mon]”;
}
应该行得通


(注意:“每日”和“累计”缺少第二行,一旦有了这一行,就需要使用
colspan
来跨越各个月的列)。参见colspan示例。

这里是对您提供的代码的重写,它使用虚拟随机数据而不是DB,POST变量没有逻辑,但您可以用代码替换

<?php   
  // session start, db connection goes here  
  echo '<table border="1" align="center">';
  // Example of post vars
  $start = new DateTime('2015-11-10');
  $end = new DateTime('2016-02-28');
  // Note: not sure why OP used modify here
  $interval = new DateInterval('P1M');
  $daterange = new DatePeriod($start, $interval, $end);

  // Table Header row 1
  echo '<tr><th>Day</th>';
  foreach ($daterange as $date) {
    echo '<th colspan="2">'.$date->format("F Y").'</th>';
  }
  echo '</tr>';

  // Temporary month store
  $months = array();

  // Table Header row 2
  echo '<tr style="background-color:#22bb22;"><th></th>';
  foreach ($daterange as $date) {
    $months[] =  $date->format("F");
    echo '<th>Daily</th>';
    echo '<th>Cumulative</th>';
  }
  echo '</tr>';

  // Table Body
  $sumc = array();
  for ($d = 1; $d <= 31; $d++) {
    echo '<tr><td>'.$d.'</td>';
    foreach ($months as $month) {
      $db_date = $month.'-'.$d; // used for db query
      // dummmy data (replace with db query result)
      $sum = mt_rand(0, 999);
      echo '<td>'.$sum.'</td>';
      if(!array_key_exists($month, $sumc)) {
        $sumc[$month] = 0;
      }
      $sumc[$month] = (int)$sum + $sumc[$month];
      echo '<td>'.$sumc[$month].'</td>';
    }
    echo '</tr>';  
  }

  echo '</table>';
?>

这里是对您提供的代码的重写,它使用伪随机数据而不是DB,POST变量没有逻辑,但您可以用代码替换

<?php   
  // session start, db connection goes here  
  echo '<table border="1" align="center">';
  // Example of post vars
  $start = new DateTime('2015-11-10');
  $end = new DateTime('2016-02-28');
  // Note: not sure why OP used modify here
  $interval = new DateInterval('P1M');
  $daterange = new DatePeriod($start, $interval, $end);

  // Table Header row 1
  echo '<tr><th>Day</th>';
  foreach ($daterange as $date) {
    echo '<th colspan="2">'.$date->format("F Y").'</th>';
  }
  echo '</tr>';

  // Temporary month store
  $months = array();

  // Table Header row 2
  echo '<tr style="background-color:#22bb22;"><th></th>';
  foreach ($daterange as $date) {
    $months[] =  $date->format("F");
    echo '<th>Daily</th>';
    echo '<th>Cumulative</th>';
  }
  echo '</tr>';

  // Table Body
  $sumc = array();
  for ($d = 1; $d <= 31; $d++) {
    echo '<tr><td>'.$d.'</td>';
    foreach ($months as $month) {
      $db_date = $month.'-'.$d; // used for db query
      // dummmy data (replace with db query result)
      $sum = mt_rand(0, 999);
      echo '<td>'.$sum.'</td>';
      if(!array_key_exists($month, $sumc)) {
        $sumc[$month] = 0;
      }
      $sumc[$month] = (int)$sum + $sumc[$month];
      echo '<td>'.$sumc[$month].'</td>';
    }
    echo '</tr>';  
  }

  echo '</table>';
?>


根据您提供的输出屏幕截图,假设您已成功输出每日金额,但缺少累计金额是否正确?是的,这非常正确。根据您提供的输出屏幕截图,假设您已成功输出每日金额,但缺少累计金额,这是否正确?是的,这是非常正确的。我认为日期问题不是问题,而是累计部分。@Leereal所以您要将某一段时间内的所有金额相加?我要将同一个月的所有金额总和相加,但它是累计金额不同月份的同一天。这是2015-11-01到2015-12-01的总和,这不是我想要的。我希望它将2015-11-01添加到2015-11-02。我认为有更好的方法可以做到这一点。但是我希望我的工作日是从1日到31日,无论是哪个月。要了解我的意思,你能忘记代码,看看我想要的图像,然后与我想要的图像进行比较吗have@Leereal好了,这将返回与所需表中的内容非常相似的内容。您只需要在查询结果中添加一些HTML标记,就可以得到您的表格。我认为日期问题不是问题,而是累积部分。@Leereal那么您想对某段时间内的所有金额进行合计吗?我想将同一个月的所有金额合计,但将不同月份同一天的金额相加。这是2015-11-01到2015-12-01的总和,这不是我想要的。我希望它将2015-11-01添加到2015-11-02。我认为有更好的方法可以做到这一点。但是我希望我的工作日是从1日到31日,无论是哪个月。要了解我的意思,你能忘记代码,看看我想要的图像,然后与我想要的图像进行比较吗have@Leereal好了,这将返回与所需表中的内容非常相似的内容。您只需要在查询结果中添加一些HTML标记,就可以得到您的表格您的想法是正确的,但我想将所有相同的总数相加