[英]PHP SQL SUM column with condition
我有如下表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列的記錄必須與總價50000+30000
合並)。 這是我所做的:
// $sql = mysqli_query($con, "SELECT * FROM table_order
// WHERE deptnr='$departmetnnr' AND orderstatus='CLOSE'
// AND orderdate BETWEEN '$oneyearbefore' AND '$currentdate' ORDER BY orderdate");
$sql = mysqli_query($con, "
SELECT SUM(price) AS totalprice
FROM table_order
WHERE deptnr = '$departmetnnr'
AND orderstatus='CLOSE'
AND orderdate BETWEEN '$oneyearbefore' AND '$currentdate'
ORDER
BY orderdate
");
$data = array();
while($row=mysqli_fetch_assoc($sql)) {
$data[] = ($row);
}
$json = json_encode($data);
老實說,我是PHP和SQL的新手,我嘗試為Mobile Apps構建簡單的Web服務,所以我想在服務器中處理所有計算並以JSON形式輸出。
我看了一下PHP和SQL的一些基本語句(在w3school,有時在堆棧溢出的答案),問題礦山就喜歡這個 ,但我還沒有找到合適的輸出。 我喜歡閱讀任何建議/參考鏈接(如果有)。 提前致謝。
如果要獲取每個日期的總和,則需要GROUP BY orderdate
。 這將為orderdate
每個不同值創建一個組,然后可以使用聚合函數SUM()
獲取每個組的每個總和(因此,對於您來說,這是每個日期的價格總和)。
如果不提供GROUP BY orderdate
, 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);
您需要添加GROUP BY orderdate
,一切順利。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.