我有一个如下的视图,可以过滤从开始日期到结束日期的选定日期范围内的收发项目,如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;
}
出了什么问题。有人能帮忙吗?
1条答案
按热度按时间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 |
这是查询:
..或者如果您更熟悉派生表,只需将
SELECT ..
放在括号中的查询上方,然后为其分配别名。这里有一个小提琴:https://dbfiddle.uk/-vWlsi8w