PHP SQL SUM列与条件

时间:2019-07-15 09:18:46

标签: php mysql

我有下面的表table_order

orderid | orderdate   | price  | deptnr
--------+-------------+--------+----------
1       | 2019-07-12  | 50000  | 1
2       | 2019-07-12  | 30000  | 1
3       | 2019-07-13  | 40000  | 1
4       | 2019-07-14  | 50000  | 1

我需要输出table_order上所有列的条件,如果有相同的日期,则price值将累积到一条记录中(第1列和第2列的记录必须与总价格{{ 1}})。这是我所做的:

50000+30000

老实说,我是PHP和SQL的新手,我尝试为Mobile Apps构建简单的Web服务,因此我想在服务器中处理所有计算并将其输出为JSON。

我已经阅读了一些有关PHP和SQL的基本声明(在w3school中,有时在Stack Overflow答案中),与诸如this之类的问题有关,但我仍未找到正确的输出。我喜欢阅读任何建议/参考链接(如果有)。预先感谢。

2 个答案:

答案 0 :(得分:3)

如果要获取每个日期的总和,则需要GROUP BY orderdate。这会为orderdate的每个不同值创建一个组,然后可以使用聚合函数SUM()来获取每个组的每个总和(因此,对于您来说,这就是每个日期的价格总和)。

如果不提供GROUP BY orderdate,则只获取所有行的和。

SELECT SUM(price) as totalprice, orderdate
FROM table_order
WHERE deptnr='$departmetnnr' 
  AND orderstatus='CLOSE' 
  AND orderdate  BETWEEN '$oneyearbefore' AND '$currentdate' 
GROUP BY orderdate
ORDER BY orderdate

也就是说,您当前正在将变量直接注入查询中,应该通过使用准备好的语句来避免这种情况。

$stmt = $con->prepare("SELECT SUM(price) as totalprice, orderdate
                       FROM table_order
                       WHERE deptnr=? 
                         AND orderstatus='CLOSE' 
                         AND orderdate  BETWEEN ? AND ? 
                       GROUP BY orderdate
                       ORDER BY orderdate");
$stmt->bind_param("sss", $departmetnnr, $oneyearbefore, $currentdate);
$stmt->execute();
$stmt->bind_result($totalprice, $orderdate);
while ($stmt->fetch()) {
    $data[] = ["totalprice" => $totalprice, "orderdate" => $orderdate];
}
$stmt->close();
$json = json_encode($data);

您还可以使用SQL函数来创建过去1年并获取当前日期,而不是使用PHP值。使用CURDATE()获取当前日期,然后定义一个从中减去1年的时间间隔,这些间隔将成为BETWEEN的范围。

$stmt = $con->prepare("SELECT SUM(price) as totalprice, orderdate
                       FROM table_order
                       WHERE deptnr=? 
                         AND orderstatus='CLOSE' 
                         AND orderdate  BETWEEN CURDATE() AND CURDATE() - INTERVAL 1 YEAR
                       GROUP BY orderdate
                       ORDER BY orderdate");
$stmt->bind_param("s", $departmetnnr);
$stmt->execute();
$stmt->bind_result($totalprice, $orderdate);
while ($stmt->fetch()) {
    $data[] = ["totalprice" => $totalprice, "orderdate" => $orderdate];
}
$stmt->close();
$json = json_encode($data);

答案 1 :(得分:2)

您需要添加GROUP BY orderdate,一切顺利。