我已经为此工作了两天,无法理解,我需要一些帮助。
目标 - 除其他外...
- 对所有项目时间表条目求和
- 对所有项目发票求和
按项目 (projectID) 将它们分组并显示在表格中。
在与上述表格相同的页面上,有一个表单允许用户输入新的时间表条目。刷新时,运行和表格显示更新的时间表总数。
当前情况 - 当我提交时间表表格时(例如:项目 X 为 1.25 小时),发生了三件事。
- 表单数据被提交到数据库。这非常有效。数据输入正是它应该的样子。
- 页面刷新,项目 X 的时间表条目更新 2.5 小时(应该增加 1.25)
- 发票总额也会增加该项目的发票总额。即,如果已为项目 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/