簡體   English   中英

如何調整UNION ALL查詢?

[英]How to tune UNION ALL query?

下面的MySQL查詢結果為每個帳戶代碼( acctcode )的貸方和借方之和,並用union all產生總數。 ledg_post表具有570萬條記錄,並已建立索引。 查詢仍然需要1分鍾才能執行。 請幫助我調整此查詢。

select b.acnt_code as acctcode 
,      b.disp_name as acctname
,      sum(amt_dr) as debit
,      sum(amt_cr) as credit
,      (sum(amt_dr)- sum(amt_cr)) as closingbalance
,      a.txn_code as txn_code
from   ledg_post a
,      gl_acnts b
,      mst_loan lmt
where  a.acnt_code = b.acnt_code 
group 
by     b.acnt_code
union all
select  ' ' acctcode
,       ' Grand Total ' acctname
,       sum(amt_dr) debit
,       sum(amt_cr) credit
,       (sum(amt_dr)- sum(amt_cr)) closingbalance
,       '' txn_code
from    ledg_post a
,       mst_loan  lmt
where   lmt.loan_id = a.ref_id

表定義

 create table ledg_post 
 ( txn_code  int(11) 
 , ref_id    int(11)
 , acnt_code int(11) 
 , amt_dr    decimal(20, 2) 
 , amt_cr    decimal(20, 2) 
 );

 create table gl_acnts 
 ( glm_acnt_code      int
 , glm_acnt_disp_name varchar(50) 
 );

 create table mst_loan 
 ( lmt_loan_id int(11) 
 , lmt_clnt_id int(11) 
 );

無需使用UNION ALL ,您可以使用GROUP BY ... WITH ROLLUP實現

嘗試這個:

SELECT b.acnt_code AS acctcode, IFNULL(b.disp_name, ' Grand Total ') AS acctname, 
       SUM(a.amt_dr) AS debit, SUM(a.amt_cr) AS credit, 
      (SUM(a.amt_dr)- SUM(a.amt_cr)) AS closingbalance, 
       IFNULL(a.txn_code, '') AS txn_code
FROM ledg_post a 
INNER JOIN gl_acnts b ON a.acnt_code=b.acnt_code 
GROUP BY acctcode WITH ROLLUP

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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