The most elegant way to get the difference between two tables - not least!

Hello


Simplified example of what I'm trying to achieve - I have two tables ORIGINAL and REVISED.


My aim is to compare the two, such as; -


When there is data in the two tables I get the difference between the Budget column, and if there is no difference, so I don't want no lines.

When data exists in the ORIGINAL, but not in review, I want to the inverse of the current value of the Budget column.

Where the data exist in REVISED I want the REVISED value.

I can see how I can do this, see below, but is there a more elegant solution?




Data for the ORIGINAL table
select '801040' entity, '2186' expense_type, 234000 budget
from dual
union all
select '801040' entity, '3001' expense_type, 1000 budget
from dual
union all
select '801040' entity, 'P132' expense_type, 34000 budget
from dual
union all
select '801040' entity, 'P135' expense_type, 43000 budget
from dual
Data for the REVISED table
select '801040' entity, '2186' expense_type, 235000 budget
from dual
union all
select '801040' entity, 'P132' expense_type, 34000 budget
from dual
union all
select '801040' entity, 'P139' expense_type, 56000 budget
from dual
Desired output



ENTITY EXPENSE_TYPE DIFFERENCE
------ ------------ ----------
801040 2186 1000
801040 3001-1000
801040 P135-43000
801040 P139 56000

5 selected lines.



Code current to achieve this, is there a better way?
select original.entity
,      original.expense_type
,       (nvl(revised.budget,0) - original.budget) as difference
from   original
,      revised
where  original.entity = revised.entity(+)
and    original.expense_type = revised.expense_type(+)
and   (nvl(revised.budget,0) - original.budget) != 0
union all
select  revised.entity
,       revised.expense_type
,       revised.budget as difference
from   revised
where  not exists
(select 'x'
from   original
where  original.entity = revised.entity
and    original.expense_type = revised.expense_type)
and    revised.budget != 0
Thanks a lot for your comments,.


Robert.

Published by: Robert Angel on January 17, 2012 03:31 to change is not equal to! = - Thanks for the heads up
SQL> with original
  2  as
  3  (
  4    select '801040' entity, '2186' expense_type, 234000 budget
  5    from dual
  6    union all
  7    select '801040' entity, '3001' expense_type, 1000 budget
  8    from dual
  9    union all
 10    select '801040' entity, 'P132' expense_type, 34000 budget
 11    from dual
 12    union all
 13    select '801040' entity, 'P135' expense_type, 43000 budget
 14    from dual
 15  )
 16  , revised
 17  as
 18  (
 19    select '801040' entity, '2186' expense_type, 235000 budget
 20    from dual
 21    union all
 22    select '801040' entity, 'P132' expense_type, 34000 budget
 23    from dual
 24    union all
 25    select '801040' entity, 'P139' expense_type, 56000 budget
 26    from dual
 27  )
 28  select *
 29    from (
 30          select nvl(o.entity, r.entity) entity,
 31                 nvl(o.expense_type, r.expense_type) expense_type,
 32                 nvl(r.budget,0) - nvl(o.budget,0) budget
 33            from original o
 34            full join revised r
 35              on o.entity = r.entity
 36             and o.expense_type = r.expense_type
 37         )
 38   where budget <> 0
 39  /

ENTITY EXPE     BUDGET
------ ---- ----------
801040 2186       1000
801040 P135     -43000
801040 3001      -1000
801040 P139      56000

SQL>

Tags: Database

Similar Questions

  • Find the difference between two date and time

    Hi friends,

    I wanted to find the difference between two date and time, but my qury is slightest error "invalid number."

    select sql_step_num,proc_name,run_seqno,start_date,end_date,(to_char(start_date,'HH24-MI-SS') - to_char(end_date,'HH24-MI-SS') ) as ed  
    from eval.EVAL_RUNTIME_DETAILS
    where trunc(start_date) = trunc(sysdate) 
    order by sql_step_num;

    You try to get the feel between two char strings.
    And more difference between two dates gives a NUMBER of days.
    Try this:

    select sql_step_num,proc_name,run_seqno,start_date,end_date,numtodsinterval(end_date-start_date,'DAY') as ed
    from eval.EVAL_RUNTIME_DETAILS
    where trunc(start_date) = trunc(sysdate)
    order by sql_step_num;
    
  • What is the difference between a table and a subform?

    What is the difference between a table and a subform in LC forms? Please post your answers about the merits and demerits of using subforms instead of tables.

    Hello

    a table is simply a set of subforms with a particular role.

    It is easier to handle the tables if they must be dynamic (add or remove lines, show or hide lines when page breaks appear etc..).

    And Designers UI has some dialogue prepared in the object palette to simplify the settings of the tables.

    For subforms, dialog boxes are more frequent, so you have yourself a little more script.

    But at least you can do everything with subforms as you can do with tables.

    The only one who is not very good with tables we work when you wrap arrays in other tables.

  • How to find the difference between two dates in the presentation layer

    Hi gurus,

    Hello to everyone. Today, I came with the new requirement.


    I need to know the difference between a date and the current date in the formula column application presentation layer.by.



    Thank you and best regards,
    Prates

    Hi Navin,

    TIMESTAMPDIFF function first determines the timestamp component that corresponds to the specified interval setting. For example, SQL_TSI_DAY corresponds to the day component and SQL_TSI_MONTH corresponds to the component "month".

    If you want to display the difference between two dates in days using SQL_TSI_DAY, unlike butterflies SQL_TSI_MONTH and so on...

    hope you understand...

    Award points and to close the debate, if your question is answered.

    See you soon,.
    Aravind

  • Difference between two tables (ORA-01722)

    I am trying to get the difference of two tables on two databases.

    Walker I run the script below, it gives me a result that is not accurate.
    Select name, creation_time of v$datafile@REMOTE_database.com
    2 LESS THAN
    3 select name, creation_time from v$ datafile;

    I get 14 ranks of foregoing.
    However, when I run this script, I get an accurate count of the difference. How can I list the exact number instead of only to count the difference? Want lists all five name missing on table 2.
    SQL > SELECT a.cnt - b.cnt
    > count 2 (name) select cnt (of v$datafile@REMOTE_database.com) a, b
    3 (select count (name) NTC v$ datafile);

    A.CNT - B. CNT
    -----------
    5
    edited by: Albert Zaza on July 19, 2010 11:19

    have you tried:

    select trim(upper(name)) from v$datafile@REMOTE_database.com
     MINUS
     select trim(upper(name)) from v$datafile;
    
  • Dynamic action - Get the difference between two dates + times

    I have problems a little dynamic to work action. I'm trying to get the time between two dates with the time difference.

    Here is what I got (this is apex 4.0):

    Two date pickers + two numbers fields (date/start/end times)

    I created a dynamic action on the page who fires on the point lose focus (above points).

    The real action for the DA is the body of the PL/SQL function:
    declare
      end_date DATE;
      start_date DATE;
    Begin
      start_date := to_char(:P1_START_DATE || ' ' || :P1_START_TIME, 'DD-MON-YYYY HH:MIAM');
      end_date := to_char(:P1_END_DATE || ' ' || :P1_END_TIME, 'DD-MON-YYYY HH:MIAM');
      :P1_HOURS := end_date-start_date;
    End;
    When I change the values on the page, I get the following error:

    AJAX call back Server error ORA-06502: PL/SQL: digital or value error: character number conversion error to set the value.

    I'm guessing that there is a problem with the date formatting, but I can't make it work. Thanks in advance!

    Hi djston,

    because you chose the dynamic action of 'Set value' with the "Body of the PL/SQL function" type you need to return the value. Try the following code

    declare
      end_date DATE;
      start_date DATE;
    Begin
      start_date := to_date(:P1_START_DATE || ' ' || :P1_START_TIME, 'DD-MM-YYYY HH:MIAM');
      end_date := to_date(:P1_END_DATE || ' ' || :P1_END_TIME, 'DD-MM-YYYY HH:MIAM');
      RETURN (end_date-start_date)*24;
    End;
    

    and P1_REQUESTED_HOURS like 'item affected. "

    Concerning
    Patrick
    -----------
    My Blog: http://www.inside-oracle-apex.com
    APEX 4.0 Plug-Ins: http://apex.oracle.com/plugins
    Twitter: http://www.twitter.com/patrickwolf

    Published by: Patrick Wolf on January 17, 2011 10:54

  • How can I compare the differences between two files After Effects?

    I have a major problem.  I was working on special effects for a film.  In After Effects, when I change siggificant, I often have to register under and create a new name so I can go back to the old work if necessary.  It comes in a case, I have come back from earlier works.  If I use these two files After Effects allows you to create multiple clips of effects.  And I do not remember just where you look at it, it is better.  Does anyone know a good way to compare the differences between the files?

    One thing to keep this conversation on the right way: I know that I did a stupid thing.  I've never done this before so can we please not spend a lot of time on how to avoid this problem and stick to how we solve this problem?

    If you encounter difficulties to identify differences in the old and new versions, you can use this procedure:

    To avoid confusion, I'll call your former company and your most recent compositions CompB comps.

    CompA drag "New Comp" icon in the project window.  This will create a new temporary layout that contains the nested CompA.

    Drag in your new COMP CompB temporary ensure it aligns image for image with CompA.

    Place the top layer (CompB) difference.

    Now, when you play through the comp, you'll see differences in color at a time where the comparison and CompB are not identical.

  • Formula of FormCalc to make the difference between two time fields if they are populated - help please


    Hello

    I have a laptop (TotalTime1) which refers to two other cells in the updated hour-shaped (Start1 and 1 to finish).

    The formula below is intended to make the difference between the time of departure and of arrival if they are populated.

    I had to work unconditionally HasValue, but the formula was calculated when there is no value in the Start1 and Finish1 (due to the time format).

    This is the code I have, it is said that there is an error of almost the last line; I'm sorry if I'm posting this in the wrong way, I haven't posted on this forum before but this is:

    If (HasValue (Finish1) and HasValue (Start1)) then if (Time2Num (Start1.formattedValue, "HH: mm") < Time2Num (Finish1.formattedValue, "Hh: mm")) then Abs (Time2Num (Start1.formattedValue, "HH: mm")-Time2Num (Finish1.formattedValue, "HH: mm")) / (60 * 60 * 1000) another 24 - ABS (Time2Num (Finish1.formattedValue, "HH: mm")-Time2Num (Start1.formattedValue, "HH: mm")) / (60 * 60 * 1000) endif

    Any help would be appreciated.

    Cordially Fetachini

    you need an another endif at the end (you have nested statement and only 1 endif)

  • How to find the difference between two dates in time except Sunday

    Hi all

    I have a table, as shown below.
    SQL> select * from test;
    
    TR_ID                                              CREATE_TIME                                                                       CODE
    -------------------------------------------------- --------------------------------------------------------------------------- ----------
    S12341                                             05-JUN-12 12.20.52.403000 AM                                                      1003
    S12342                                             11-JUN-12 11.15.33.182000 AM                                                      1003
    S12342                                             07-JUN-12 12.00.36.573000 PM                                                      1002
    S12343                                             20-JUN-12 12.34.37.102000 AM                                                      1003
    S12343                                             15-JUN-12 11.34.27.141000 PM                                                      1002
    S12344                                             01-JUL-12 10.01.06.657000 PM                                                      1002
    S12344                                             06-JUL-12 12.01.04.188000 AM                                                      1003
    S12341                                             31-MAY-12 11.20.38.529000 PM                                                      1002
    I would like to know the difference between same tr_ids create_time, which should give out in hours except Sunday.

    For example:

    TR_ID: S12344
    1002_Create_time: July 1, 12 PM 10.01.06.657000 (i.e. Sunday)
    1003_Create_time: 12.01.04.188000 AM 6 July 12

    1002 create time is 22:00 Sunday.

    If the query must exclude only the hours of Sunday which is 10 p.m. to Monday 00 h which is 2 Hrs.

    I tried the sub query after doing a search on this forum but I am not getting the desired output.
    SELECT count(*) FROM (SELECT ROWNUM RNUM,tr_id,create_time CT_1002 FROM test c WHERE c.tr_id='S12344' and 
    ROWNUM <= (select (cast(a.create_time as date)-cast((select create_time from test b where a.tr_id=b.tr_id and code=1002) as date)) 
    from test a where a.code=1003 and a.tr_id=c.tr_id) + 1) d 
    WHERE to_char(cast((select create_time from test e where e.tr_id=d.tr_id and code=1002) as date) + RNUM - 1, 'DY') NOT IN('SUN');
    Need help to get the desired o/p

    Hello

    If I unederstand the problem correctly, that's what you want:

    WITH       got_extrema     AS
    (
         SELECT       tr_id
         ,       CAST (MIN (create_time) AS DATE)     AS start_date
         ,       CAST (MAX (create_time) AS DATE)     AS end_date
         FROM       test
         GROUP BY  tr_id
    )
    SELECT       tr_id
    ,       start_date, end_date          -- If wanted
    ,       24 * ( ( ( TRUNC (end_date,   'IW')          -- Count -1 day for every full week
                        - TRUNC (start_date, 'IW')
                 )
               / -7
                  )
                + LEAST ( end_date               -- If end_date is a Sunday
                            , TRUNC (end_date, 'IW') + 6     -- consider it 00:00:00 on Sunday
                     )
                - CASE
                          WHEN  start_date >= TRUNC (start_date, 'IW') + 6     -- If start_date is a Sunday
                   THEN  TRUNC (start_date, 'IW') + 6               -- consider it 00:00:00 Sunday
                   ELSE  start_date
                      END
                )     AS total_hours
    FROM      got_extrema
    ;
    

    I guess that you don't need to worry about fractions of a second. As you did in the code you have posted, I am to convert the TIMESTAMP to date values, because of DATE arithmetic and functions are so much better than what is available for timestamps.

    Basically, it's just to find the number of days between start_date and end_date and multiplying by 24, with these twists:
    (a) 1 day is deducted for each week between start_date and end_date
    (b) if End_date is a Sunday, none of the end_date himself hours are counted
    (c) If start_date is a Sunday, then all the start_date himself hours are counted. Why these hours should be counted? Because 1 day is already being deducted for the week which includes start_date, which contains only this Sunday.

    TRUNC (dt, 'IW') is the beginning of the ISO week containing dt; in other words, 00:00:00 the or before the dt last Monday. This is not the NLS parameters.

    Of course, I can't test without some sample data and the exact results you want from these data. You may need a little something more If start_date and end_date are both on the same Sunday.
    Whenever you have a problem, please post a small example of data (CREATE TABLE and only relevant columns, INSERT statements) of all of the tables involved.
    Also post the results you want from this data, as well as an explanation of how you get these results from these data, with specific examples.
    Always tell what version of Oracle you are using.
    See the FAQ forum {message identifier: = 9360002}

  • How to tell the difference between two dates

    Hello:

    I have a question on how to get the difference in quantities for two dates in the replies and dashboard.

    This is the scenario. I have two guests date and three columns. The first column must be the sum of the amounts for the first quick date. The second column should be the sum of the amounts for the second fast date. And the third column is the difference between the first two columns.

    Basically, I'm trying to do something similar to a function of sum of two lines but trying to get the difference between the two rows. Any help to solve this problem would be appreciated.

    Use the COLUMN FILTERS level...

    the first column with the first variable of date quick presentation of the filter

    Similarly, the second column in the second variable of quick overview of date filter

    Kind regards
    Rambeau

  • Find the difference between two numbers (DBL)

    Hi all

    Is there a function in labview other than the subtraction function that can find the difference between the two numbers given?

    Thank you

    Davidson


  • Take the difference of two tables

    Hello

    I have two tables where in I need to take the difference between the two columns of different tables and show as decimal below:

    Table A

    Name, salary

    x 10.5

    y - 10.32

    z 5

    Table B

    Name, salary

    x 10.5

    y - 10.32

    z 3

    a 12

    Output:

    Name_A, Name_B, salary, remarks

    x, x, 0, no diff

    y, y, 0, no diff

    z, z, 2 Diff is here

    , one, no data, no data from the previous

    Hello

    Try ythis:

    with table_a as
    (
    SELECT 'X' NAME, SALARY, 10.5 DUAL UNION ALL
    SELECT THE NAME OF 'Y',-10.32 SALARY OF DOUBLE UNION ALL
    SELECT THE NAME OF 'Z', 5 DOUBLE SALARY
    )
    table_B as
    (
    SELECT 'X' NAME, SALARY, 10.5 DUAL UNION ALL
    SELECT THE NAME OF 'Y',-10.32 SALARY OF DOUBLE UNION ALL
    SELECT THE NAME OF 'Z', 3 DOUBLE UNION ALL SALARIES
    SELECT 'A' NAME, SALARY 12 DUAL FROM
    )
    SELECT
    COALESCE(A.NAME,B.NAME) NAME
    , NVL (TO_CHAR (A.SALARY - B.SALARY), 'NO DATA') SALARY
    , CASE WHEN A.SALARY - B.SALARY = 0 THEN 'NO DIFFERENCE '.
    WHEN B.SID IS NULL, "NO DATA OF THE PREVIOUS.
    WHERE B.NAME IS NULL, "NO DATA FROM NEXT.
    ANOTHER 'DIFFERENCE IS THERE.
    END NOTE

    Of
    TABLE_A HAS
    TABLE_B FULL OUTER JOIN B ON (B.SID = B.NAME)
    ;

    NAME SALARY NOTE
    ---- ---------------------------------------- ---------------------
    X 0 NO DIFFERENCE
    Y 0 NO DIFFERENCE
    Z 2 THE DIFFERENCE IS THERE
    A NUMBER OF DATA NO DATA FROM THE PREVIOUS

    Kind regards

    Peter

  • How to store the difference between two timestamps as a number?

    Hello
    I need to find the difference between 2 variables of timestamp and the result will be stored as a number in minutes?
    as
    declare
    timestamp (7) of the fir_timestamp: = 1 January 2012 13:30 ';
    timestamp (7) of the sec_timestamp: = 1 January 2012 14:00 ';
    c number;
    Start
    c:=((sec_timestamp-fir_timestamp)/(24*60));
    dbms_output.put_line (c);
    end;

    962813 wrote:
    declare

    -fir_timestamp timestamp (7): ='01 - jan - 2012 13:30 ';
    timestamp (7) of the sec_timestamp: = 1 January 2012 14:00 ';  Incorrect type declaration

    fir_timestamp timestamp: = 1st January 12 01.30.00.000000 PM';
    sec_timestamp timestamp: = 1st January 12 02.00.00.000000 PM';
    c number;
    Start
    c: = ABS ((extrait (HEURE de sec_timestamp) - extract (fir_timestamp TIME)) * 60) +.
    ABS ((extrait (MINUTE de sec_timestamp) - extract (fir_timestamp MINUTE)));
    dbms_output.put_line (' interval Min Total:-' | c);
    end;
    /
    declare
    *
    ERROR on line 1:
    ORA-01830: date format picture ends before converting all of the input string
    ORA-06512: at line 6

    Follow what Paul has done...

    In fact, you do not need timestamp, date data type is enough

    SQL> declare
      2     fir_timestamp date :=
      3        to_date('01-jan-2012 13:30:00','dd-mon-yyyy hh24:mi:ss');
      4     sec_timestamp date :=
      5        to_date('01-jan-2012 14:00:00','dd-mon-yyyy hh24:mi:ss');
      6     c number;
      7  begin
      8     c:= round((sec_timestamp-fir_timestamp)*24*60);
      9     dbms_output.put_line(c);
     10  end;
     11  /
    30
    
    PL/SQL procedure successfully completed.
    

    If you want to place on timestamp

    SQL> declare
      2     fir_timestamp timestamp :=
      3        to_timestamp('01-jan-2012 13:30:00','dd-mon-yyyy hh24:mi:ss');
      4     sec_timestamp timestamp :=
      5        to_timestamp('01-jan-2012 14:00:00','dd-mon-yyyy hh24:mi:ss');
      6     c number;
      7  begin
      8     c:= round((
      9     to_date(to_char(sec_timestamp,'ddmmyyyyhh24miss'),
     10             'ddmmyyyyhh24miss')-
     11          to_date(to_char(fir_timestamp,'ddmmyyyyhh24miss'),
     12             'ddmmyyyyhh24miss')
     13           )*24*60);
     14     dbms_output.put_line(c);
     15  end;
     16  /
    30
    
  • By selecting the difference between two images

    Hello

    I have two photos exactly the same thing that I took using a tripod, studio lighting and general conditions. However, in the second photo, I inserted a subject - in this case a sculpture complex. Photoshop can merge these two images together AND choose so the difference between the two images - in this case the sculpture complex?

    Basically, I need to select the sculpture and do not want to spend time manually selecting due to its complexity. I need to separate the background and the sculpture for editing on their own layers.

    Thank you

    Stephen-CS3

    You posted this in the two forums, its been answered in the mac forum.

  • How to calculate the difference between two times by the NUMBERS

    I'm so bothered by the fact that I can't understand that.

    Cell B2 - 08:00

    Cell C2 - 10:50

    (How can cell D2 - I get this cell to calculate the difference and say 02:50?)

    I know it's probably one of the most basic operations, but for the life of me I can't understand it. The cells B2 and C2 are formatted for a 24-hour clock. But if I tell the system to just subtract the two, I get "0,118. Everything I find on the forum search goes beyond what I need. Can someone help me?

    Thank you

    Hi sapirs,

    Departure and arrival of the cells are in Date and time with Date format: no and time: 24-hour clock.

    Formula in D2 (fill down)

    = C2−B2

    The results become a duration format, but under automatic (numbers automatically worth this format)

    If you wish, you can change the cells of lasting results.

    What Data Format have your result cells?

    Kind regards

    Ian.

Maybe you are looking for

  • change user

    I tried to run mozilla firefox as always double click and it opens this time a pop came out asking me to select a user, I chose 1 on both I feel like I could have selected the wrong one miss me many of my bookmarks and things like that I don't know h

  • Why Firefox Crash everytime I open several tabs?

    When I opened many tabs, Firefox always crashes. I just tried, updated Firefox and Windows, updated my plugins, tests for the crash in SafeMode. Still nothing works Crash ID: bp-2e11554a-1c25-4f94-84cc-9410a2130820

  • Short hard drive DST Check: failure

    Could someone please explain these results, please. Here are the basics: Computer: HP 2000 OS: Windows 8 Problem: Short hard drive DST Check: failure Failure ID: Q0C5W3-6KU67W-MFGJWJ - 60T 203 Product ID: D1E81UA #ABA Thank you.

  • Error messages receivers dv6 HP Envy locations

    Hello I don't know if it corresponds to the Commission, but I this will give a shot anyway. I've not had problems with my wifi until recently. When I visit some sites (main pages of blogs Tumblr for example), I got the dreaded message 503 Service una

  • Install expression Web SP2 remote

    I am an admin of LAN and have 25 licensed copies of Expression Web 3 on workstations in my network.  Is there a way to make it past the user 1st question, 'Do you want to install?' when you try to install Service pack 2?  I use a Symantec product to