0

2 つの SQL テーブルがあります

unit_transaction unit_detail_transactions

(ここのテーブル スキーマ: http://sqlfiddle.com/#!3/e3204/2 )

ここにテーブルとそれらのサンプルデータがあります

必要なのは、残高のあるテーブルを生成するために SQL クエリを実行することです。現在、この SQL クエリがありますが、同じ日付の 2 つのトランザクションがあると残高が正しく計算されないため、正常に動作しません。

SELECT 
ft.transactionid,
ft.date,
ft.reference,
ft.transactiontype,
CASE ftd.isdebit WHEN 1 THEN MAX(ftd.debitaccountid) ELSE MAX(ftd.creditaccountid) END as financialaccountname,
CAST(COUNT(0) as tinyint) as totaldetailrecords,
ftd.isdebit,
SUM(ftd.amount) as amount,
balance.amount as balance
FROM unit_transaction_details ftd
JOIN unit_transactions ft ON ft.transactionid = ftd.transactionid
JOIN
(
    SELECT DISTINCT
    a.transactionid,
    SUM(CASE b.isdebit WHEN 1 THEN b.amount ELSE -ABS(b.amount) END) as amount
    --SUM(b.debit-b.credit) as amount
    FROM unit_transaction_details a
    JOIN unit_transactions ft ON ft.transactionid = a.transactionid
    CROSS JOIN unit_transaction_details b
    JOIN unit_transactions ft2 ON ft2.transactionid = b.transactionid
    WHERE (ft2.date <= ft.date)
    AND ft.unitid = 1
    AND ft2.unitid = 1
    AND a.masterentity = 'CONDO-A'
    GROUP BY a.transactionid,a.amount

) balance ON balance.transactionid = ft.transactionid

WHERE 
ft.unitid = 1
AND ftd.isactive = 1
GROUP BY 
ft.transactionid,
ft.date,
ft.reference,
ft.transactiontype,
ftd.isdebit,
balance.amount
ORDER BY ft.date DESC

クエリの結果は次のとおりです。

SQL クエリの結果

子孫モードでトランザクション日付順に並べ替えられた正しい残高を表示する正しい SQL を実行する方法についての手がかりはありますか?

どうもありがとう。

編集:2つの可能な解決策を考えてください

この問題は、2 つのトランザクションで同じ日付を持っている場合に発生するため、次のようにします。

  1. 日付と時刻を「日付」列に保存します。そうすれば、2 つの正確な日付はありません。

また

  1. 「優先度」列を作成し、各レコードの優先度を設定します。したがって、日付が既に存在し、優先度が 1 であることがわかった場合、現在の優先度は 2 になります。

どう思いますか?

4

1 に答える 1

4

ランニングサムを行うには2つの方法があります。簡単な表に構文を示して、アイデアを示します。

一部のデータベース(Oracle、PostgreSQL、SQL Server 2012、Teradata、DB2など)は、累積合計を直接サポートします。このために、次の関数を使用します。

select sum(<val>) over (partition by <column> order by <ordering column>)
from t

これは、で識別されるレコードの各グループの現在の合計を計算するウィンドウ関数です。合計の順序はです。

残念ながら、多くのデータベースはこの機能をサポートしていないため、データベース内の単一のSELECTクエリでこれを行うには、自己結合を行う必要があります。

select t.column, sum(tprev.<val>) as cumsum
from t left join
     t tprev
     where t.<column> = tprev.<column> and
           t.<ordering column> >= tprev.<ordering column>
group by t.column

別のテーブルを作成し、カーソルを使用して累積合計を割り当てたり、アプリケーションレベルで合計を実行したりすることもできます。

于 2012-07-16T13:35:24.490 に答える