【问题标题】:Issue with SUM doubling resultSUM 加倍结果的问题
【发布时间】:2011-03-08 07:56:13
【问题描述】:

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

目标 - 除此之外......

  • 汇总所有项目时间表条目
  • 汇总所有项目发票

将这些按项目 (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

【问题讨论】:

    标签: php mysql sum


    【解决方案1】:

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

    您需要单独执行分组:

    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
    

    【讨论】:

    • 您解决了我的问题并在此过程中教会了我一些东西。谢谢。非常感谢。
    猜你喜欢
    • 2012-07-07
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2011-08-06
    相关资源
    最近更新 更多