2016-03-31 3 views
2

Ich habe eine ORACLE-Ansicht und muss einen Bericht basierend auf dieser Ansicht generieren. Dies ist das Anzeigebeispiel.ORACLE - So erstellen Sie ein temporäres Feld basierend auf bestimmten Daten in einem bestimmten Feld

SELECT DATE, VOUCHER_NO, CURRENCY, AMOUNT, DESCRIPTION, JOURNAL_TYPE, COA_NO 
FROM VIEW_EXAMPLE 

|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  |(NULL)| 
|03/30/2016|0000000002|USD  |1500 |ABCD  |CREDIT  |150002| 
|03/30/2016|0000000002|USD  |1000 |ABCD  |DEBIT  |530001| 
|03/30/2016|0000000002|USD  |500 |ABCD  |DEBIT  |540002| 
|03/31/2016|0000000003|USD  |4000 |ABCD  |CREDIT  |150003| 
|03/31/2016|0000000003|USD  |2000 |ABCD  |DEBIT  |520002| 
|03/31/2016|0000000003|USD  |1000 |ABCD  |DEBIT  |520004| 
|03/31/2016|0000000003|USD  |500 |ABCD  |DEBIT  |520005| 
|03/31/2016|0000000003|USD  |500 |ABCD  |DEBIT  |520010| 

Ich habe die Aufzeichnungen von DATE und COA_NO als Parameter, aber wie Sie sehen können, die COA_NO wo JOURNAL_TYPE ist DEBIT unterschiedlich sind. Die COA_NO, die den Parameter entsprechen, ist in der CREDIT. Bei den Daten handelt es sich um Kredit- und Debit-Paare, die auf der VOUCHER_NO basieren, und ein Kredit kann mehr als eine Lastschrift haben.

Zunächst verwende ich diese Abfrage:

SELECT DATE, VOUCHER_NO, CURRENCY, AMOUNT, DESCRIPTION, JOURNAL_TYPE, COA_NO 
FROM VIEW_EXAMPLE 
WHERE DATE = @date 
AND VOUCHER_NO IN (SELECT VOUCHER_NO FROM VIEW_EXAMPLE WHERE COA_NO = @coa_no) 

Es funktioniert, wenn ich will nur ein COA_NO bekommen. Aber, das Problem ist, ich muss auch alle COA_NO in spezifischen DATE und verwenden Sie es, um die Daten zu gruppieren (in C#).

Ich versuche auch, zwei Abfragen zu erstellen, zuerst um alle COA_NO in einem bestimmten Datum zu erhalten, und zweitens die Daten abzufragen, indem Sie es foreach COA_NO an diesem Datum durchlaufen. Aber es ist sehr langsam, weil es in diesem Datum alle COA_NO Datenbank abfragen musste.

Also ich denke, ich muss ein temporäres Feld erstellen, das die COA_NO des Kredits für alle Datensätze enthält, so.

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

|03/30/2016|0000000001|USD  |2000 |ABCD  |CREDIT  |150001|150001 | 
|03/30/2016|0000000001|USD  |2000 |ABCD  |DEBIT  |(NULL)|150001 | 
|03/30/2016|0000000002|USD  |1500 |ABCD  |CREDIT  |150002|150002 | 
|03/30/2016|0000000002|USD  |1000 |ABCD  |DEBIT  |530001|150002 | 
|03/30/2016|0000000002|USD  |500 |ABCD  |DEBIT  |540002|150002 | 
|03/31/2016|0000000003|USD  |4000 |ABCD  |CREDIT  |150003|150003 | 
|03/31/2016|0000000003|USD  |2000 |ABCD  |DEBIT  |520002|150003 | 
|03/31/2016|0000000003|USD  |1000 |ABCD  |DEBIT  |520004|150003 | 
|03/31/2016|0000000003|USD  |500 |ABCD  |DEBIT  |520005|150003 | 
|03/31/2016|0000000003|USD  |500 |ABCD  |DEBIT  |520010|150003 | 

Wie geht das? Oder ist das eine andere Möglichkeit, diese Daten mit der COA_NO zu gruppieren?

Und auch ich habe ORDER diese Daten von AMOUNT ohne die VOUCHER_NO Paare zu brechen. (Optional)

Antwort

2

Sie nur eine analytische Funktion müssen die berechnete Spalte, um zu bestimmen, so etwas wie:

with view_example 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, null 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, 530001 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, 540002 coa_no from dual union all 
         select to_date('31/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('31/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 2000 amount, 'ABCD' description, 'DEBIT' journal_type, 520002 coa_no from dual union all 
         select to_date('31/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 1000 amount, 'ABCD' description, 'DEBIT' journal_type, 520004 coa_no from dual union all 
         select to_date('31/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 500 amount, 'ABCD' description, 'DEBIT' journal_type, 520005 coa_no from dual union all 
         select to_date('31/03/2016', 'dd/mm/yyyy') dt, 3 voucher_no, 'USD' currency, 500 amount, 'ABCD' description, 'DEBIT' journal_type, 520010 coa_no from dual) 
-- the above subquery is used to mimic the data in your VIEW_EXAMPLE. 
-- You wouldn't need it - just use the SQL below: 
select dt, 
     voucher_no, 
     currency, 
     amount, 
     description, 
     journal_type, 
     coa_no, 
     max(case when journal_type = 'CREDIT' then coa_no end) over (partition by voucher_no) related_credit_coa_no 
from view_example 
order by voucher_no, journal_type, amount; 

DT   VOUCHER_NO CURRENCY  AMOUNT DESCRIPTION JOURNAL_TYPE  COA_NO RELATED_CREDIT_COA_NO 
---------- ---------- -------- ---------- ----------- ------------ ---------- --------------------- 
30/03/2016   1 USD   2000 ABCD  CREDIT   150001    150001 
30/03/2016   1 USD   2000 ABCD  DEBIT         150001 
30/03/2016   2 USD   1500 ABCD  CREDIT   150002    150002 
30/03/2016   2 USD    500 ABCD  DEBIT   540002    150002 
30/03/2016   2 USD   1000 ABCD  DEBIT   530001    150002 
31/03/2016   3 USD   4000 ABCD  CREDIT   150003    150003 
31/03/2016   3 USD    500 ABCD  DEBIT   520010    150003 
31/03/2016   3 USD    500 ABCD  DEBIT   520005    150003 
31/03/2016   3 USD   1000 ABCD  DEBIT   520004    150003 

N. B. Wenn Abbuchungen ein anderes Datum als ihre Abbuchungen haben könnten, könnten Sie am Ende falsche Ergebnisse erhalten, wenn Sie einen Filter auf das Datum direkt in der obigen Abfrage hinzufügen - stattdessen müssten Sie eine Unterabfrage verwenden, z.

select * 
from (select dt, 
       voucher_no, 
       currency, 
       amount, 
       description, 
       journal_type, 
       coa_no, 
       max(case when journal_type = 'CREDIT' then coa_no end) over (partition by voucher_no) related_credit_coa_no 
     from view_example) 
where dt = :p_date 
-- and related_credit_coa_no = :p_coa_no -- if required 
order by voucher_no, journal_type, amount; 
+0

Vielen Dank Boneinist, es hat wirklich funktioniert. Ich kann den Bericht jetzt schneller erstellen. – grayfield