2013-01-18 37 views
1

假設我們有日記帳分錄表如下構建會計線索平衡報告的性能問題

create table jour_entries 
(jseq number, 
    j_date date, 
    Eseq number, 
    account_no varchar2(32), 
    debit number, 
    credit number, 
    note varchar2(256)); 

如何構建在SQL試算平衡最好的業績報告?報告欄爲

  • account_number:是帳號。

  • debit_within_month:就是ACCOUNT_NUMBER從給定本月1日開始,直到該月月底與所有借方的總和(或直到當天如果給定的日期是當月)

  • credit_within_month:是的總和所有從第一個月開始到第二個月的帳戶號碼相關的所有信用額(或如果給定日期是當前月份,直到當前日期)

  • debit_till_this_day:是所有與帳戶號碼相關的所有借項的累計總和給定日期(從給定日期的第一天開始到當天)。 credit_till_this_day:是給定日期(從給定日期的第一天開始到當天)的所有與account_number相關的積分總和。


我想這個選擇:

select account_number 
     , debit_within_month 
     , credit_within_month 
     , debit_till_this_day 
     , credit_till_this_day 
from jour_entries j, 
    (select account_number, sum(debit) debit_within_month, 
         sum(credit) credit_within_month 
       from jour_entries 
       where j_date between trunc(given_date, 'month') and given_date 
       group by account_number 
    ) j1, 
    (select account_number, sum(debit) debit_till_this_day, 
         sum(credit) credit_till_this_day 
       from jour_entries 
       where j_date between trunc(given_date, 'year') and given_date 
       group by account_number 
    ) j2 
wherer j.account_number = j1.account_number 
and j.account_number = j2.account_number 

,但我正在尋找其他的解決方案(可能通過使用分析功能),以獲得最佳性能。

+0

你已經試過了什麼? – a1ex07

+0

不考慮性能,當給定日期不在當前月份時,您的解決方案不會爲每月總計提供正確的結果。而你TIL CURRENT總數的邏輯也是錯誤的。 – APC

+0

好吧,如果我們在2012年6月,並且用戶輸入日期'31 -may-2012',那麼報告應該給我每個帳戶號碼所有交易(借方,貸方)發生在5月和所有交易從2012年開始到結束可能。 –

回答

0

如果我理解你的問題,聽起來像這樣的事情應該爲你工作:

SELECT JE.Account_no as Account__Number, 
    SUM(JE2.debit) as Debit_Within_Month, 
    SUM(JE2.credit) as Credit_Within_Month, 
    SUM(JE.debit) as Debit_Till_This_Day, 
    SUM(JE.credit) as Credit_Till_This_Day 
FROM Jour_Entries JE 
    LEFT JOIN (
     SELECT jseq, Account_No, Debit, Credit 
     FROM Jour_Entries 
     WHERE to_char(j_date, 'YYYY') = 2013 AND to_char(j_date, 'mm') = 2 
    ) JE2 ON JE.jseq = JE2.jseq 
WHERE to_char(j_date, 'YYYY') = 2013 
GROUP BY JE.Account_no 

這裏的sql fiddle

祝你好運。

2

我將使用SQL * Plus替換變量語法來指示given_month。無論您使用的是什麼客戶端,您都需要更改此設置。

select account_number 
     , sum (case when J_date between trunc(&given_date, 'mm') 
            and least(sysdate, last_day(&given_date)) 
      then debit else 0 end) as debit_within_month 
     , sum (case when J_date between trunc(&given_date, 'mm') 
            and least(sysdate, last_day(&given_date)) 
      then credit else 0 end) as credit_within_month 
     , sum (case when J_date between trunc(&given_date, 'yyyy') and sysdate) 
       then debit else 0 end) as debit_til_this_day 
     , sum (case when J_date between trunc(&given_date, 'yyyy') and sysdate) 
       then credit else 0 end) as credit_til_this_day 
from jour_entries 
group by account_number 

說明

  • trunc()施加到日期它截斷給定的格式掩碼。所以trunc(sysdate, 'mm')給出了本月的第一個,而'yyyy'面具給出了今年的第一個。
  • last_day()給出,呃給定月份的最後一天。
+1

這是做到這一點的方法。對於試算表,您需要分類賬表中的每一行,因爲資產負債表項目將是「迄今爲止」的餘額。每行需要完整掃描將比索引查找效率更高,並且您唯一的選擇是嘗試僅按照此處所述的方式掃描表格一次。 –