我有下面的表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之类的问题有关,但我仍未找到正确的输出。我喜欢阅读任何建议/参考链接(如果有)。预先感谢。
答案 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
,一切顺利。