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: 特定の月の 1 日からその月末まで (または、特定の日付が当月の場合は当日まで) の account_number に関連するすべての借方の合計です。

  • credit_within_month: 特定の月の 1 日からその月末まで (または、特定の日付が当月の場合は当日まで) の account_number に関連するすべてのクレジットの合計です。

  • debit_till_this_day: 特定の日付の 1 年間 (特定の日付の 1 月 1 日から現在まで) の account_number に関連するすべての借方の累積合計です。

  • credit_till_this_day: 特定の日付の 1 年間 (特定の日付の 1 月 1 日から現在まで) の 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

しかし、最高のパフォーマンスを得るために、他のソリューションを(おそらく分析関数を使用して)探しています。

4

2 に答える 2

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()日付に適用すると、指定された書式マスクに切り捨てられます。Sotrunc(sysdate, 'mm')は月の最初を示し、'yyyy' マスクは年の最初を示します。
  • last_day()ええと、指定された月の最終日を返します。
于 2013-01-18T21:24:31.297 に答える
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フィドルです。

幸運を。

于 2013-01-18T21:09:50.740 に答える