簡體   English   中英

PHP SQL SUM列與條件

[英]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 orderdateGROUP 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM