如何避免在 mariadb 视图中两次计算字段

问题描述 投票:0回答:1

我在

mariadb
中有以下视图,它提供股票贷方、借方和余额:

SELECT pitem,
    Bdate,
    credit,
    debit, 
    sum(ifnull(bal, 0)) OVER (PARTITION BY pitem ORDER BY bdate, DESC1) balance, 
    DESC1
FROM (
    SELECT a.Pitem,
        a.Bdate,
        a.Trn,
        If((trn=1 AND a.qty>0), a.Qty, 0) AS Credit,
        If(trn=0 OR a.qty<0, abs(a.Qty), 0) AS Debit,
        (If((trn=1 AND a.qty>0), a.Qty, 0)) - (If(trn=0 OR a.qty<0, abs(a.Qty), 0)) AS Bal,
        a.Desc1
    FROM (
        SELECT tblphmrefill.RfItem AS PItem,
            tblphmrefill.rfDate AS BDate,
            tblphmrefill.rfQty AS Qty,
            CONCAT(
                if(rfqty>0, 'Purchase No_', 'Discard_BMW_'), 
                coalesce(tblphmrefill.RfInvoice, 0), '_Vend_', rfsuppID
            ) AS DESC1,
            1 AS Trn
        FROM tblphmrefill
        UNION (
            SELECT invoicerefundphm.phmItem AS pItem,
                invoice.Bdate,
                invoicerefundphm.Qty,
                CONCAT('Refund_', billno, '_', invoice.BName) AS DESC1,
                1 AS Trn
            FROM invoice
        )
        INNER JOIN invoicerefundphm 
        ON invoice.BilID = invoicerefundphm.Billno
        UNION (
            SELECT invoicephm.phmItem AS PItem,
                invoice.BDate,
                invoicephm.Qty,
                CONCAT('Sales_', billno, '_', invoice.BName),
                0 AS Trn
            FROM invoicephm
            INNER JOIN invoice 
            ON invoicephm.Billno = invoice.BilID 
            ORDER BY invoice.bdate, invoice.bilid ASC
        )
    ) AS a 
) phmtbatch_int 
Order by Bdate, DESC1 Asc 

问题出在这部分:

SELECT a.Pitem,
   a.Bdate,
   a.Trn,
   If((trn=1 AND a.qty>0), a.Qty, 0) AS Credit,
   If(trn=0 OR a.qty<0, abs(a.Qty), 0) AS Debit,
   (If((trn=1 AND a.qty>0), a.Qty, 0)) - (If(trn=0 OR a.qty<0, abs(a.Qty), 0)) AS Bal,
   a.Desc1

这里的代码正在计算余额,但运行相同的计算两次。

我尝试过以下事情:

SELECT a.Pitem,
     a.Bdate,
     a.Trn,
     @Credit := (If((trn=1 AND a.qty>0), a.Qty, 0)) AS Credit,
     @Debit := (If(trn=0 OR a.qty<0, abs(a.Qty), 0)) AS Debit,
     (@Credit - @Debit) AS Bal,
     a.Desc1

但是 mariadb 抛出了一个

error 1351
说法

view contains variable or parameter which is not allowed

有什么办法可以避免计算两次贷方、借方余额?

sql mysql mariadb
1个回答
0
投票
SELECT a.Pitem,
   a.Bdate,
   a.Trn,
   If((trn=1 AND a.qty>0), a.Qty, 0) AS Credit,
   If(trn=0 OR a.qty<0, abs(a.Qty), 0) AS Debit,
   (SELECT Credit - Debit) AS Bal,
   a.Desc1
© www.soinside.com 2019 - 2024. All rights reserved.