php - SUM 加倍结果的问题

标签 php mysql sum

我已经为此工作了两天,无法理解,我需要一些帮助。

目标 - 除其他外...

  • 对所有项目时间表条目求和
  • 对所有项目发票求和

按项目 (projectID) 将它们分组并显示在表格中。

在与上述表格相同的页面上,有一个表单允许用户输入新的时间表条目。刷新时,运行和表格显示更新的时间表总数。

当前情况 - 当我提交时间表表格时(例如:项目 X 为 1.25 小时),发生了三件事。

  1. 表单数据被提交到数据库。这非常有效。数据输入正是它应该的样子。
  2. 页面刷新,项目 X 的​​时间表条目更新 2.5 小时(应该增加 1.25)
  3. 发票总额也会增加该项目的发票总额。即,如果已为项目 X 开具 5000 美元的发票,则添加新的时间表条目会将其推至 10,000 美元、15,000 美元...等等。

查询 - 如下:

<?php
    $query = "SELECT tsm_projects.projectName AS projectName,   tsm_projects.projectID AS projectID, tsm_projects.value AS value, tsm_projects.estHours AS estHours, tsm_clients.clientName AS clientName, tsm_projects.estHours - SUM(tsm_timesheets.time) AS remaining, SUM(tsm_invoices.invoiceValue) AS invoiceValue, SUM(tsm_timesheets.time) AS totalTime FROM tsm_projects
    LEFT JOIN tsm_timesheets ON tsm_projects.projectID = tsm_timesheets.projectID
    LEFT JOIN tsm_clients ON tsm_clients.clientID = tsm_projects.clientID
    LEFT JOIN tsm_invoices ON tsm_invoices.projectID = tsm_projects.projectID
    WHERE projectType = 'active'
    GROUP BY tsm_timesheets.projectID 
    ORDER BY tsm_projects.projectName";
    $result = mysql_query($query) or die(mysql_error());
    while($row = mysql_fetch_array($result)){
    echo "<tr><td>". $row['projectName'] . " [" . $row['clientName'] . "]</td><td>$" . number_format($row[value], 2, '.', ',') . " [" . $row['estHours'] . "]</td><td>$" . $row['invoiceValue'] . "</td><td>" . number_format($row[totalTime], 2, '.', ',') ." [";
    if($row["remaining"] <= 0) {
    echo "<span class=\"redText\">" . $row['remaining'] . "</span>"; }
    else {
    echo "<span class=\"greenText\">+" . $row['remaining'] . "</span>"; }
    echo "]</td></tr>"; }
?>

SQL - 我猜时间表和/或发票表可能相关:

TABLE `tsm_timesheets` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `projectID` varchar(10) NOT NULL,
  `activity` varchar(20) NOT NULL,
  `date` date NOT NULL,
  `time` decimal(4,2) NOT NULL,
  `timesheetID` varchar(10) NOT NULL,
  `memberID` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
)

TABLE `tsm_invoices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `projectID` varchar(10) NOT NULL,
  `month` varchar(15) NOT NULL,
  `notes` varchar(255) NOT NULL,
  `invoiceValue` decimal(10,2) NOT NULL DEFAULT '0.00',
  `gstValue` decimal(10,2) NOT NULL DEFAULT '0.00',
  `fee` decimal(6,2) NOT NULL DEFAULT '0.00',
  `costs` decimal(6,2) NOT NULL DEFAULT '0.00',
  `invoiceNumber` varchar(15) NOT NULL,
  `dateSent` date NOT NULL,
  `dateDeposit` date NOT NULL,
  `dateAdded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `addedBy` varchar(20) NOT NULL,
  `invoiceID` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
)

希望有人能帮忙。提前致谢。

rr5

最佳答案

聚合函数是基于每个结果行而不是每个表行计算的。

您需要单独执行分组:

LEFT JOIN (
  SELECT projectID, SUM(invoiceValue) AS SumInvoiceValue
  FROM tsm_invoices
  GROUP BY projectID) i ON i.projectID = tsm_projects.projectID

整个查询:

SELECT p.projectName AS projectName, p.projectID AS projectID, p.value AS value,
    p.estHours AS estHours, c.clientName AS clientName,
    p.estHours - t.SumTime AS remaining,
    i.SumInvoiceValue AS invoiceValue,
    t.SumTime AS totalTime
FROM tsm_projects p
    LEFT JOIN tsm_clients c ON c.clientID = p.clientID
    LEFT JOIN (
        SELECT projectID, SUM(time) AS SumTime
        FROM tsm_timesheets
        GROUP BY projectID
      ) t ON p.projectID = t.projectID
    LEFT JOIN (
        SELECT projectID, SUM(invoiceValue) AS SumInvoiceValue
        FROM tsm_invoices
        GROUP BY projectID
      ) i ON i.projectID = p.projectID
WHERE projectType = 'active'
GROUP BY p.projectID 
ORDER BY p.projectName

关于php - SUM 加倍结果的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5229812/

相关文章:

php - 将表格和样式添加到 PHP 回显代码

Java MySQL - 命名管道连接在关闭时抛出警告

php - 如何从 MySQL 中获取最近 7 天的行?

json - JQgrid总金额行

Ruby:组合数组值

php - GET 表单方法不会附加参数

php - 我无法比较数据库中的密码和输入的密码

php css 如何根据成员更改名称颜色?

php - 变量作为列名称的一部分

Java for 循环(数字总和+总计)