codeigniter MySQL查询返回期初余额不正确

xn1cxnb4  于 2023-09-28  发布在  Mysql
关注(0)|答案(1)|浏览(101)

我有一个如下的视图,可以过滤从开始日期到结束日期的选定日期范围内的收发项目,如A4,A3,.......。

在“order_status”下的表中,接收由“purchase”表示,而发出由“issue”表示。如本例所示,仅存在日期范围2023-08-01至2023-08-31中的问题。表单中的接收数量按以下代码输出

(CASE store_update_stock.order_status
  WHEN "ob" AND "purchase" AND billed_date <= "$start" 
  THEN store_update_stock_details.qty 
  ELSE 0
  END) p2,

期望输出

我想得到截至2023年7月31日的期末余额,作为截至2023年8月1日的期初余额,如A4为255。然后这些问题可以从这个期初余额中扣除。

错误

但过滤器排除了“0”的开始日期,而问题是正确的。
我的模型如下:

public function issueDetailReport($id,$start,$end){
    $this->db->select('*,     
      (CASE 
      WHEN store_update_stock.order_status = "issue"  THEN store_branch.branch_name     
      ELSE tbl_supplier.supplier_name
      END) supplier_officer_name,

      (CASE 
      WHEN store_update_stock.order_status = "issue" THEN store_update_stock.request_no      
      ELSE store_update_stock.bill_no
      END) number,      

      (CASE store_update_stock.order_status
      WHEN "issue" AND store_update_stock.billed_date <= "$start"  
      THEN store_update_stock_details.qty * (-1)    
      ELSE store_update_stock_details.qty * (-1)
      END) quantity,

      (CASE store_update_stock.order_status
      WHEN "purchase" AND billed_date <= "$start" 
      THEN store_update_stock_details.qty 
      ELSE 0
      END) p2,     

      (CASE store_update_stock.order_status      
      WHEN "purchase" THEN store_update_stock_details.qty AND store_update_stock.billed_date <= "$start"  
      WHEN "issue" THEN store_update_stock_details.qty AND store_update_stock.billed_date <= "$start" 
      END) balance    
     ');    

    $this->db->from('store_update_stock');
    $this->db->join('store_update_stock_details','store_update_stock.update_stock_id=store_update_stock_details.update_stock_id', 'inner');     
    $this->db->join('store_branch','store_update_stock.branch_id=store_branch.branch_id', 'left' );     
    $this->db->join('tbl_supplier','store_update_stock.supplier=tbl_supplier.supplier_id', 'left');     
    $this->db->join('store_item','store_update_stock_details.item=store_item.item_id', 'left');
    $this->db->where("store_update_stock.status='1' and store_item.item_id=$id");
    $this->db->where("store_update_stock_details.qty <> 0");
    if($start!=NULL && $end!=NULL)
        $this->db->where("store_update_stock.billed_date BETWEEN '$start' AND '$end'");     
    $this->db->order_by('store_update_stock.billed_date','ASC');
    $q=$this->db->get();
    if($q->num_rows()>0){
        return $q->result();
    }
    return false;
}

出了什么问题。有人能帮忙吗?

gojuced7

gojuced71#

在MySQL v8中,你可以使用窗口函数如SUM() OVER ()LAG()来实现如下结果:
| 订单状态|开票日期|Previous_balance|数量|数量_余额|
| --|--|--|--|--|
| 接收|2023-07-15| * 为空 *| 100 | 100 |
| 发布|2023-07-16| 100 | 5 | 95 |
| 发布|2023-07-17| 95 | 10 | 85 |
| 发布|2023-07-18| 85 | 15 | 70 |
| 发布|2023-07-19| 70 | 11 | 59 |
| 发布|2023-07-21| 59 | 3 | 56 |
| 发布|2023-07-23 - 2023-07-23| 56 | 9 | 47 |
| 接收|2023-07-25| 47 | 100 | 147 |
| 发布|2023-07-26 2023-07-26| 147 | 20 | 127 |
| 发布|2023-07-27 2023-07-27| 127 | 19 | 108 |
| 发布|2023-07-28 2023-07-28| 108 | 8 | 100 |
| 发布|2023-07-30| 100 | 7 | 93 |
| 发布|2023-07-31| 93 | 9 | 84 |
| 发布|2023-08-01 2023-08-01| 84 | 5 | 79 |
| 发布|2023-08-02| 79 | 9 | 70 |
| 发布|2023-08-03| 70 | 6 | 64 |
| 发布|2023-08-04| 64 | 7 | 57 |
| 发布|2023-08-05 2023-08-05| 57 | 11 | 46 |
| 发布|2023-08-06| 46 | 21 | 25 |
这是查询:

WITH cte AS
(SELECT order_status,
        billed_date,
        qty,
       SUM(IF(order_status='received',qty,0)-IF(order_status='issued',qty,0))
        OVER (ORDER BY billed_date) AS Qty_balance
   FROM store_update_stock
  ORDER BY billed_date) 
SELECT order_status,
        billed_date,
        LAG(Qty_balance) OVER (ORDER BY billed_date) Previous_balance,
        qty,
        Qty_balance
   FROM cte;

..或者如果您更熟悉派生表,只需将SELECT ..放在括号中的查询上方,然后为其分配别名。

SELECT order_status,
        billed_date,
        LAG(Qty_balance) OVER (ORDER BY billed_date) Previous_balance,
        qty,
        Qty_balance
   FROM (SELECT order_status,
        billed_date,
        qty,
       SUM(IF(order_status='received',qty,0)-IF(order_status='issued',qty,0))
        OVER (ORDER BY billed_date) AS Qty_balance
   FROM store_update_stock
  ORDER BY billed_date) a;

这里有一个小提琴:https://dbfiddle.uk/-vWlsi8w

相关问题