2016-04-01 12 views
0

私はこのようなテーブルを持っています。ORACLE - データ行のペアを注文するカスタムORDER BY

|DATE  |VOUCHER_NO|CURRENCY|AMOUNT|DESCRIPTION|JOURNAL_TYPE|COA_NO | 

|03/30/2016|0000000001|USD  |2000 |ABCD  |CREDIT  |150001 | 
|03/30/2016|0000000001|USD  |2000 |ABCD  |DEBIT  |150001 | 
|03/30/2016|0000000002|USD  |1500 |ABCD  |CREDIT  |150002 | 
|03/30/2016|0000000002|USD  |1000 |ABCD  |DEBIT  |150002 | 
|03/30/2016|0000000002|USD  |500 |ABCD  |DEBIT  |150002 | 
|03/30/2016|0000000003|USD  |4000 |ABCD  |CREDIT  |150003 | 
|03/30/2016|0000000003|USD  |2000 |ABCD  |DEBIT  |150003 | 
|03/30/2016|0000000003|USD  |1000 |ABCD  |DEBIT  |150003 | 
|03/30/2016|0000000003|USD  |500 |ABCD  |DEBIT  |150003 | 
|03/30/2016|0000000003|USD  |500 |ABCD  |DEBIT  |150003 | 

まず、ジャーナルタイプクレジットをもって、最大額でテーブルをソートする必要があります。それには、デビットの金額に関係なく、Voucher_Noに基づいたデビットが続き、次に2番目に大きな金額の次にデビットがあります。

|DATE  |VOUCHER_NO|CURRENCY|AMOUNT|DESCRIPTION|JOURNAL_TYPE|COA_NO | 

|03/30/2016|0000000003|USD  |4000 |ABCD  |CREDIT  |150003 | 
|03/30/2016|0000000003|USD  |2000 |ABCD  |DEBIT  |150003 | 
|03/30/2016|0000000003|USD  |1000 |ABCD  |DEBIT  |150003 | 
|03/30/2016|0000000003|USD  |500 |ABCD  |DEBIT  |150003 | 
|03/30/2016|0000000003|USD  |500 |ABCD  |DEBIT  |150003 | 
|03/30/2016|0000000001|USD  |2000 |ABCD  |CREDIT  |150001 | 
|03/30/2016|0000000001|USD  |2000 |ABCD  |DEBIT  |150001 | 
|03/30/2016|0000000002|USD  |1500 |ABCD  |CREDIT  |150002 | 
|03/30/2016|0000000002|USD  |1000 |ABCD  |DEBIT  |150002 | 
|03/30/2016|0000000002|USD  |500 |ABCD  |DEBIT  |150002 | 

どのようにするのですか?私が金額で最初に注文した場合、デビットのものは下に分散し、最初にvoucher_noで注文した場合、金額で注文されません。

答えて

4

あなたはORDER BY私は一度確認していないが、この

ORDER BY 
    MAX(AMOUNT) OVER (PARTITION BY VOUCHER_NO) DESC, -- voucher with highest amount first 
    VOUCHER_NO, -- all rows of that voucher 
    CASE WHEN JOURNAL_TYPE = 'CREDIT' THEN 0 ELSE 1 END, -- credit first 
    AMOUNT DESC 
+0

特定のバウチャーの場合、これは「払い戻し」の前に「クレジット」となるでしょうか? –

+0

@sql_dummy:最初に 'credit'を追加する必要がある場合は、別の列を追加する必要があります。私は自分の答えを編集します。 – dnoeth

+0

彼は最高額で伝票を尋ねます。彼は最大のクレジット額を持っているバウチャーに尋ねました。 –

0

のような最初のグループ和は、この

 SELECT * from ... ORDER BY JOURNAL_TYPE asc, AMOUNT asc; 

EDIT1を確認することができます。-Misunderstoodあなたの質問を、再編集私は聞かせて私の答え。
EDIT2: - 正しい答えはすでに
注dnoethユーザーによって投稿されています - これはこれはトリックを行う必要があり、正解

2

ではありません:あなたはするつもりなら、

with your_table as (select to_date('30/03/2016', 'dd/mm/yyyy') dt, 1 voucher_no, 'USD' currency, 2000 amount, 'ABCD' description, 'Credit' journal_type, 150001 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 1 voucher_no, 'USD' currency, 2000 amount, 'ABCD' description, 'Debit' journal_type, 150001 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 2 voucher_no, 'USD' currency, 1500 amount, 'ABCD' description, 'Credit' journal_type, 150002 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 2 voucher_no, 'USD' currency, 1000 amount, 'ABCD' description, 'Debit' journal_type, 150002 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 2 voucher_no, 'USD' currency, 500 amount, 'ABCD' description, 'Debit' journal_type, 150002 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 4000 amount, 'ABCD' description, 'Credit' journal_type, 150003 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 2000 amount, 'ABCD' description, 'Debit' journal_type, 150003 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 1000 amount, 'ABCD' description, 'Debit' journal_type, 150003 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 500 amount, 'ABCD' description, 'Debit' journal_type, 150003 coa_no from dual union all 
        select to_date('30/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 500 amount, 'ABCD' description, 'Debit' journal_type, 150003 coa_no from dual) 
-- End of mimicking your table with data in. See SQL below: 
select * 
from your_table 
order by max(amount) over (partition by voucher_no) desc, 
     journal_type, 
     amount desc; 

DT   VOUCHER_NO CURRENCY  AMOUNT DESCRIPTION JOURNAL_TYPE  COA_NO 
---------- ---------- -------- ---------- ----------- ------------ ---------- 
30/03/2016   3 USD   4000 ABCD  Credit   150003 
30/03/2016   3 USD   2000 ABCD  Debit   150003 
30/03/2016   3 USD   1000 ABCD  Debit   150003 
30/03/2016   3 USD    500 ABCD  Debit   150003 
30/03/2016   3 USD    500 ABCD  Debit   150003 
30/03/2016   1 USD   2000 ABCD  Credit   150001 
30/03/2016   1 USD   2000 ABCD  Debit   150001 
30/03/2016   2 USD   1500 ABCD  Credit   150002 
30/03/2016   2 USD   1000 ABCD  Debit   150002 
30/03/2016   2 USD    500 ABCD  Debit   150002 

NBを副問合せでこの問合せを使用している場合は、明らかに、その列を外部問合せに公開するために、選択列リストにmax(amount) over (partition by voucher_no)を追加する必要があります。


ETA。

max(amount) over (partition by voucher_no) 

に:あなたは、借方金額がクレジット額よりも大きかった、とあなたが最初に表示される最高のクレジット量のバウチャーコードの行後にしている、そして変更する場合がありますことができれば
max(case when journal_type = 'Credit' then amount end) over (partition by voucher_no) 
+0

彼は最高額で伝票を尋ねます。彼は最大のクレジット額を持っているバウチャーに尋ねました。 –

+0

「voucher1デビット4000」の場合、「voucher2 credit 3000」は、「voucher2」が「voucher1」の上に来る必要があると仮定します。 –

+0

私は、a)バウチャーコードごとに1つのクレジットしか存在せず、 b)借方金額が決済金額を決して超えないこと。余分な制限を追加するために私の答えを更新しました。 – Boneist

関連する問題