Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Alternative for UNION

Tony GarabedianAug 10 2005 — edited Aug 16 2005

Hi

I have to simple sets of query Q1 and Q2, both of them have the SUM function used, they work just fine separately, but we want the result in 1 single query.
The problem is that Q1 has a master/detail table relation in the join so whenever we join both queries together the result set is being summed incorrectly according to the number of detail records found in the detail table.
Of course the solution is to use UNION operator.
What I'm looking for is an alternative for the UNION
Are there any analytical functions where I can have the result???

Query examples:

TONY@DEV> SELECT X.AUXL_RPRSNT_TITLE GRP_CODE,
  2         M.AUXL_CODE,
  3         D.ITEM_CODE,
  4         SUM(DECODE(M.TMVS_OPERATION,6,D.MVTS_QUANTITY_R,11,-D.MVTS_QUANTITY_R)) QTY
  5  FROM ISTD_STOCK_MOUVEMENTS_M M ,
  6       ISTD_STOCK_MOUVEMENTS_D D,
  7       IACD_AUXILIARIES X
  8  WHERE M.TMVS_CODE = D.TMVS_CODE
  9    AND M.CPNY_CODE = D.CPNY_CODE
 10    AND M.BRCH_CODE = D.BRCH_CODE
 11    AND M.MVTS_YEAR = D.MVTS_YEAR
 12    AND M.MVTS_DOC_NUM = D.MVTS_DOC_NUM
 13    AND X.AUXL_TYPE = M.AUXL_TYPE
 14    AND X.AUXL_CODE = M.AUXL_CODE
 15    AND X.AUXL_RPRSNT_TITLE = 1
 16    AND M.AUXL_TYPE = 1
 17  GROUP BY X.AUXL_RPRSNT_TITLE, M.AUXL_CODE, D.ITEM_CODE;

  GRP_CODE  AUXL_CODE ITEM_CODE                                         QTY
---------- ---------- ------------------------------------------ ----------
         1      33405 4030010                                           318
         1      33405 4030020                                            22
         1      33405 4030030                                            22
         1      33408 4030010                                            14
         1      33408 4030020                                             2
         1      33408 4030030                                             2
         1      33410 4030010                                           992
         1      33410 4030020                                            42
         1      33410 4030030                                            42
         1      33413 4030010                                           789
         1      33413 4030020                                            38

  GRP_CODE  AUXL_CODE ITEM_CODE                                         QTY
---------- ---------- ------------------------------------------ ----------
         1      33413 4030030                                            38
         1      33413 5010008                                             1
         1      33413 5010009                                             1
         1      33413 5010012                                             1

15 rows selected.

Elapsed: 00:00:00.00
TONY@DEV> SELECT X.AUXL_RPRSNT_TITLE GRP_CODE,
  2         X.AUXL_CODE,
  3         SUM(NVL(A.AGAC_REV_AMT, 0)) AMT,
  4         SUM(NVL(A.AGAC_AMT, 0)) PAID,
  5         SUM(NVL(A.AGAC_REV_AMT, 0) - NVL(A.AGAC_AMT, 0)) DUE
  6  FROM IACD_PAYM_AGING A,
  7       IACD_AUXILIARIES X
  8  WHERE X.AUXL_TYPE = A.AUXL_TYPE
  9    AND X.AUXL_CODE = A.AUXL_CODE
 10    AND X.AUXL_RPRSNT_TITLE = 1
 11  GROUP BY X.AUXL_RPRSNT_TITLE, X.AUXL_CODE;

  GRP_CODE  AUXL_CODE        AMT       PAID        DUE
---------- ---------- ---------- ---------- ----------
         1      33405    845.248      93.34    751.908
         1      33408     37.334      13.34     23.994
         1      33410   2655.328     394.68   2260.648
         1      33413   2103.855    293.302   1810.553

Elapsed: 00:00:00.00
TONY@DEV> SELECT X.AUXL_RPRSNT_TITLE GRP_CODE,
  2         M.AUXL_CODE,
  3         D.ITEM_CODE,
  4         SUM(DECODE(M.TMVS_OPERATION,6,D.MVTS_QUANTITY_R,11,-D.MVTS_QUANTITY_R)) QUANTITY,
  5         NULL AMT,
  6         NULL PAID,
  7         NULL DUE
  8  FROM ISTD_STOCK_MOUVEMENTS_M M ,
  9       ISTD_STOCK_MOUVEMENTS_D D,
 10       IACD_AUXILIARIES X
 11  WHERE M.TMVS_CODE = D.TMVS_CODE
 12    AND M.CPNY_CODE = D.CPNY_CODE
 13    AND M.BRCH_CODE = D.BRCH_CODE
 14    AND M.MVTS_YEAR = D.MVTS_YEAR
 15    AND M.MVTS_DOC_NUM = D.MVTS_DOC_NUM
 16    AND X.AUXL_TYPE = M.AUXL_TYPE
 17    AND X.AUXL_CODE = M.AUXL_CODE
 18    AND X.AUXL_RPRSNT_TITLE = 1
 19    AND M.AUXL_TYPE = 1
 20  GROUP BY X.AUXL_RPRSNT_TITLE, M.AUXL_CODE, D.ITEM_CODE
 21  UNION
 22  SELECT X.AUXL_RPRSNT_TITLE GRP_CODE,
 23         X.AUXL_CODE,
 24         NULL ITEM_CODE,
 25         NULL QUANTITY,
 26         SUM(NVL(A.AGAC_REV_AMT, 0)) AMT,
 27         SUM(NVL(A.AGAC_AMT, 0)) PAID,
 28         SUM(NVL(A.AGAC_REV_AMT, 0) - NVL(A.AGAC_AMT, 0)) DUE
 29  FROM IACD_PAYM_AGING A,
 30       IACD_AUXILIARIES X
 31  WHERE X.AUXL_TYPE = A.AUXL_TYPE
 32    AND X.AUXL_CODE = A.AUXL_CODE
 33    AND X.AUXL_RPRSNT_TITLE = 1
 34  GROUP BY X.AUXL_RPRSNT_TITLE, X.AUXL_CODE;

  GRP_CODE  AUXL_CODE ITEM_CODE                                    QUANTITY        AMT       PAID     DUE
---------- ---------- ------------------------------------------ ---------- ---------- ---------- ----------
         1      33405 4030010                                           318
         1      33405 4030020                                            22
         1      33405 4030030                                            22
         1      33405                                                          845.248      93.34    751.908
         1      33408 4030010                                            14
         1      33408 4030020                                             2
         1      33408 4030030                                             2
         1      33408                                                           37.334      13.34     23.994
         1      33410 4030010                                           992
         1      33410 4030020                                            42
         1      33410 4030030                                            42

  GRP_CODE  AUXL_CODE ITEM_CODE                                    QUANTITY        AMT       PAID     DUE
---------- ---------- ------------------------------------------ ---------- ---------- ---------- ----------
         1      33410                                                         2655.328     394.68   2260.648
         1      33413 4030010                                           789
         1      33413 4030020                                            38
         1      33413 4030030                                            38
         1      33413 5010008                                             1
         1      33413 5010009                                             1
         1      33413 5010012                                             1
         1      33413                                                         2103.855    293.302   1810.553

19 rows selected.

Elapsed: 00:00:05.03
TONY@DEV>

Here are samples from the joined query

TONY@DEV> ed
Wrote file afiedt.buf

  1  SELECT X.AUXL_RPRSNT_TITLE GRP_CODE,
  2         M.AUXL_CODE,
  3         D.ITEM_CODE,
  4         SUM(DECODE(M.TMVS_OPERATION,6,D.MVTS_QUANTITY_R,11,-D.MVTS_QUANTITY_R)) QUANTITY,
  5         SUM(NVL(A.AGAC_REV_AMT, 0)) AMT,
  6         SUM(NVL(A.AGAC_AMT, 0)) PAID,
  7         SUM(NVL(A.AGAC_REV_AMT, 0) - NVL(A.AGAC_AMT, 0)) DUE
  8  FROM ISTD_STOCK_MOUVEMENTS_M M ,
  9       ISTD_STOCK_MOUVEMENTS_D D,
 10       IACD_AUXILIARIES X,
 11       IACD_PAYM_AGING A
 12  WHERE M.TMVS_CODE = D.TMVS_CODE
 13    AND M.CPNY_CODE = D.CPNY_CODE
 14    AND M.BRCH_CODE = D.BRCH_CODE
 15    AND M.MVTS_YEAR = D.MVTS_YEAR
 16    AND M.MVTS_DOC_NUM = D.MVTS_DOC_NUM
 17    AND X.AUXL_TYPE = M.AUXL_TYPE
 18    AND X.AUXL_CODE = M.AUXL_CODE
 19    AND X.AUXL_TYPE = A.AUXL_TYPE
 20    AND X.AUXL_CODE = A.AUXL_CODE
 21    AND X.AUXL_RPRSNT_TITLE = 1
 22    AND M.AUXL_TYPE = 1
 23* GROUP BY X.AUXL_RPRSNT_TITLE, M.AUXL_CODE, D.ITEM_CODE
TONY@DEV> /

  GRP_CODE  AUXL_CODE ITEM_CODE                                    QUANTITY        AMT       PAID     DUE
---------- ---------- ------------------------------------------ ---------- ---------- ---------- ----------
         1      33405 4030010                                         10494  30428.928    3360.24  27068.688
         1      33405 4030020                                           726    845.248      93.34    751.908
         1      33405 4030030                                           726    845.248      93.34    751.908
         1      33408 4030010                                           140     373.34      133.4     239.94
         1      33408 4030020                                            20     37.334      13.34     23.994
         1      33408 4030030                                            20     37.334      13.34     23.994
         1      33410 4030010                                         56544 164630.336   24470.16 140160.176
         1      33410 4030020                                          2394  10621.312    1578.72   9042.592
         1      33410 4030030                                          2394   13276.64     1973.4   11303.24
         1      33413 4030010                                         56808  151477.56  21117.744 130359.816
         1      33413 4030020                                          2736  10519.275    1466.51   9052.765

  GRP_CODE  AUXL_CODE ITEM_CODE                                    QUANTITY        AMT       PAID     DUE
---------- ---------- ------------------------------------------ ---------- ---------- ---------- ----------
         1      33413 4030030                                          2736  10519.275    1466.51   9052.765
         1      33413 5010008                                            72   2103.855    293.302   1810.553
         1      33413 5010009                                            72   2103.855    293.302   1810.553
         1      33413 5010012                                            72   2103.855    293.302   1810.553

15 rows selected.

Elapsed: 00:00:03.09
TONY@DEV> ED
Wrote file afiedt.buf

  1  SELECT X.AUXL_RPRSNT_TITLE GRP_CODE,
  2         M.AUXL_CODE,
  3         D.ITEM_CODE,
  4         SUM(DECODE(M.TMVS_OPERATION,6,D.MVTS_QUANTITY_R,11,-D.MVTS_QUANTITY_R)) QUANTITY,
  5         SUM(NVL(A.AGAC_REV_AMT, 0)) AMT,
  6         SUM(NVL(A.AGAC_AMT, 0)) PAID,
  7         SUM(NVL(A.AGAC_REV_AMT, 0) - NVL(A.AGAC_AMT, 0)) DUE
  8  FROM ISTD_STOCK_MOUVEMENTS_M M ,
  9       ISTD_STOCK_MOUVEMENTS_D D,
 10       IACD_AUXILIARIES X,
 11       IACD_PAYM_AGING A
 12  WHERE M.TMVS_CODE = D.TMVS_CODE
 13    AND M.CPNY_CODE = D.CPNY_CODE
 14    AND M.BRCH_CODE = D.BRCH_CODE
 15    AND M.MVTS_YEAR = D.MVTS_YEAR
 16    AND M.MVTS_DOC_NUM = D.MVTS_DOC_NUM
 17    AND X.AUXL_TYPE = M.AUXL_TYPE
 18    AND X.AUXL_CODE = M.AUXL_CODE
 19    AND X.AUXL_TYPE = A.AUXL_TYPE
 20    AND X.AUXL_CODE = A.AUXL_CODE
 21    AND A.AUXL_CODE = M.AUXL_CODE
 22    AND A.AUXL_TYPE = M.AUXL_TYPE
 23    AND X.AUXL_RPRSNT_TITLE = 1
 24    AND M.AUXL_TYPE = 1
 25* GROUP BY X.AUXL_RPRSNT_TITLE, M.AUXL_CODE, D.ITEM_CODE
TONY@DEV> /

  GRP_CODE  AUXL_CODE ITEM_CODE                                    QUANTITY        AMT       PAID     DUE
---------- ---------- ------------------------------------------ ---------- ---------- ---------- ----------
         1      33405 4030010                                         10494  30428.928    3360.24  27068.688
         1      33405 4030020                                           726    845.248      93.34    751.908
         1      33405 4030030                                           726    845.248      93.34    751.908
         1      33408 4030010                                           140     373.34      133.4     239.94
         1      33408 4030020                                            20     37.334      13.34     23.994
         1      33408 4030030                                            20     37.334      13.34     23.994
         1      33410 4030010                                         56544 164630.336   24470.16 140160.176
         1      33410 4030020                                          2394  10621.312    1578.72   9042.592
         1      33410 4030030                                          2394   13276.64     1973.4   11303.24
         1      33413 4030010                                         56808  151477.56  21117.744 130359.816
         1      33413 4030020                                          2736  10519.275    1466.51   9052.765

  GRP_CODE  AUXL_CODE ITEM_CODE                                    QUANTITY        AMT       PAID     DUE
---------- ---------- ------------------------------------------ ---------- ---------- ---------- ----------
         1      33413 4030030                                          2736  10519.275    1466.51   9052.765
         1      33413 5010008                                            72   2103.855    293.302   1810.553
         1      33413 5010009                                            72   2103.855    293.302   1810.553
         1      33413 5010012                                            72   2103.855    293.302   1810.553

15 rows selected.

Elapsed: 00:00:00.02
TONY@DEV>

Note: If I join the A table with D table the query's returning no rows

Any suggestions are apreciated

Tony S. Garabedian

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 13 2005
Added on Aug 10 2005
18 comments
2,595 views