Recursive, hierachical query problem

Hi!
I have a hierachical SQL query using "connect by" that result in the following dataset (simplified to get down to the point):
ID       | Parent |   IsData
A        |        |    N    
  A1     |   A    |    N    
  A2     |   A    |    N    
    X1   |   A2   |    Y    
B        |        |    N    
  B1     |   B    |    N    
    X2   |   B1   |    Y    
  B2     |   B    |    N    
C        |        |    N    
  C1     |   C    |    N     There are data entries (X1 and X2) and structural (An, Bn, Cn) entries. Some nodes of the structure tree have data entries as childs, some do not.
What I need is a third column that says "this node has a data node below recursively" as shown below:
ID       | Parent |   IsData    |  HasRecursiveDataChilds
A        |        |     N       |        Y
  A1     |   A    |     N       |        N
  A2     |   A    |     N       |        Y
    X1   |   A2   |     Y       |        Y/N (doesn't matter)
B        |        |     N       |        Y
  B1     |   B    |     N       |        Y
    X2   |   B1   |     Y       |        Y/N (doesn't matter)
  B2     |   B    |     N       |        N
C        |        |     N       |        N
  C1     |   C    |     N       |        N I currently do this on the client side, after I got all the data, which involves interating through the complete dataset at least once (if you know the data well). Since the data has to be accessed from another (web) app, I want to move the logic to the server.
I'm wondering if this can be done with a simple SQL statement without using PL/SQL to iterate through the result set "manually". I can use the 10g feature set. Performance is not utterly important, so wild sub-sub-subqueries would be ok.
Thanks for your help,
Marcus

Ok, this is a bit of a fudge..
SQL> ed
Wrote file afiedt.buf
  1  with t as (select 'A' as ID, null as parent, 'N' as IsData from dual union all
  2             select 'A1','A','N' from dual union all
  3             select 'A2','A','N' from dual union all
  4             select 'X1','A2','Y' from dual union all
  5             select 'B', null, 'N' from dual union all
  6             select 'B1','B','N' from dual union all
  7             select 'X2','B1','Y' from dual union all
  8             select 'B2','B','N' from dual union all
  9             select 'C',null,'N' from dual union all
10             select 'C1','C','N' from dual)
11  -- END OF TEST DATA
12  select lpad(' ',(level-1)*2,' ')||id as id, parent, isdata
13        ,NVL((select max(t2.isdata)
14          from   t t2
15          connect by parent = prior id
16          start with parent = t.id),'N') as recursivechilddata
17  from t
18  connect by parent = prior id
19* start with parent is null
SQL> /
ID         PARENT     ISDATA     RECURSIVECHILDDATA
A                     N          Y
  A1       A          N          N
  A2       A          N          Y
    X1     A2         Y          N
B                     N          Y
  B1       B          N          Y
    X2     B1         Y          N
  B2       B          N          N
C                     N          N
  C1       C          N          N
10 rows selected.
SQL>Edited by: BluShadow on Apr 9, 2009 10:59 AM
removed redundant code

Similar Messages

  • Recursive Sub-query Factoring vs Hierarchical Query

    Experts,
    The below are two queries i am executing by using classical approach hierarchical and newest recursive sub-query.Problem is output was different for recursive sub-query factoring, as this is not showing parent-child approach, while connect by prior is showing parent-child fashion.Query 1, i am using hierarchical as it showing correct output parent-child approach, while Query 2 is displaying all the level 1 nodes and then level 2 nodes.I want query 2 output to be same as query 1.Please modify query 2 as required.
    Note:The output of the both queries won't be in displayed as it was in sqlplus, or toad.Please copy and use in your command prompts.
    QUERY 1:
    with main as(select 1 id,'john' name,null mgrid from dual union all
    select 2 id,'michael' name,null mgrid from dual union all
    select 3 id,'peter' name,null mgrid from dual union all
    select 4 id,'henry' name,1 mgrid from dual union all
    select 5 id,'nick' name,2 mgrid from dual union all
    select 6 id,'pao' name,3 mgrid from dual union all
    select 7 id,'kumar' name,3 mgrid from dual union all
    select 8 id,'parker' name,3 mgrid from dual union all
    select 9 id,'mike' name,5 mgrid from dual),
    select lpad(' ',2*(level-1))||name name,level from main start with mgrid is null connect by prior id=mgrid;
    OUTPUT :
    NAME LEVEL
    john 1
    henry 2
    michael 1
    nick 2
    mike 3
    peter 1
    pao 2
    kumar 2
    parker 2
    9 rows selected.
    QUERY 2:
    with main as(select 1 id,'john' name,null mgrid from dual union all
    select 2 id,'michael' name,null mgrid from dual union all
    select 3 id,'peter' name,null mgrid from dual union all
    select 4 id,'henry' name,1 mgrid from dual union all
    select 5 id,'nick' name,2 mgrid from dual union all
    select 6 id,'pao' name,3 mgrid from dual union all
    select 7 id,'kumar' name,3 mgrid from dual union all
    select 8 id,'parker' name,3 mgrid from dual union all
    select 9 id,'mike' name,5 mgrid from dual),
    /*select lpad(' ',2*(level-1))||name name,level from main start with mgrid is null connect by prior id=mgrid;*/
    secmain (id,name,mgrid,hierlevel) as(select id,name,mgrid,1 hierlevel from main where mgrid is null
    union all
    select m.id,m.name,m.mgrid,sm.hierlevel+1 from main m join secmain sm on(m.mgrid=sm.id))
    cycle id set is_cycle to 1 default 0
    select lpad(' ',2*(hierlevel-1))||name name,hierlevel from secmain;
    OUTPUT :
    NAME HIERLEVEL
    john 1
    michael 1
    peter 1
    henry 2
    nick 2
    parker 2
    kumar 2
    pao 2
    mike 3
    9 rows selected.

    Hi,
    What's wrong with Query 1? If it's producing the results you want, then why not use it?
    One of the nice features of CONNECT BY is that the output is automatically presented in hierachical order. The only way I know of to get the results of a recursive WITH clause in any kind or order is to do it yourself. Here's one way:
    WITH       secmain (id, name, mgrid, hierlevel, path)     AS
         SELECT  id
         ,     name
         ,     mgrid
         ,     1               AS hierlevel
         ,     RPAD (name, 10)          AS path          -- Assuming name is never longer than 10
         FROM      main
         WHERE      mgrid     IS NULL
        UNION ALL
             SELECT     m.id
         ,     m.name
         ,     m.mgrid
         ,     sm.hierlevel + 1
         ,     sm.path || RPAD (name, 10)
         FROM     main      m
         JOIN     secmain  sm  ON   (m.mgrid     = sm.id)
         CYCLE     id     -- Why do you need this if CONNECT BY NOCYCLE wasn't needed in Query 1?
         SET      is_cycle     TO 1
         DEFAULT 0
    SELECT        lpad ( ' '
                , 2 * (hierlevel - 1)
                ) || name                 AS name
    ,       hierlevel
    FROM        secmain
    ORDER BY  path
    ;Sorry, I don't have an Oracle 11.2 database right now, so I can't test it.
    Edited by: Frank Kulash on Nov 23, 2011 9:15 AM
    I didn't know about the SEARCH clause, Use Dom's solution, above.

  • Designing LOV Query Problem

    Hello APEX people,
    I posted my problem here:
    Designing LOV Query Problem
    What I have is a sequence like this:
    CREATE SEQUENCE
    DR_SEQ_FIRST_SCHEDULE_GROUP
    MINVALUE 1 MAXVALUE 7 INCREMENT BY 1 START WITH 1
    CACHE 6 ORDER CYCLE ;
    What I need would be a SQL query returning all possible values oft my sequence like:
    1
    2
    3
    4
    5
    6
    7
    I want to use it as a source for a LOV...
    The reason why I use the cycling sequence is: My app uses it to cycle scheduling priorities every month to groups identified by this number (1-7).
    In the Admin Form, I want to restrict the assignment in a user friendly way - a LOV.
    Thanks
    Johann

    Here ist the solution (posted by michales in the PL/SQL forum):
    SQL> CREATE SEQUENCE
    dr_seq_first_schedule_group
    MINVALUE 1 MAXVALUE 7 INCREMENT BY 1 START WITH 1
    CACHE 6 ORDER CYCLE
    Sequence created.
    SQL> SELECT LEVEL sn
    FROM DUAL
    CONNECT BY LEVEL <= (SELECT max_value
    FROM user_sequences
    WHERE sequence_name = 'DR_SEQ_FIRST_SCHEDULE_GROUP')
    SN
    1
    2
    3
    4
    5
    6
    7
    7 rows selected.

  • Recursive Sub-query Factoring... bug? or my own personal ignorance?

    I was trying to create a list of all dates in the current month using a recursive sub-query factor. (Oracle 11.2)
    I know how to do this by other methods; the question is, what's going on with this "WITH" example?
    Here's my attempt at generating the list:
    with
      date_list ( crnt_mnth_date )  as
        ( select  cast ( trunc(sysdate,'MM') as date )  from dual
          UNION ALL
          select  crnt_mnth_date + interval '1' day
            from  date_list
           where  to_char(crnt_mnth_date,'MM') = to_char(sysdate,'MM')
    select  *  from  date_list ;The recursion should add one day to the previous date and continue while the generated dates are in the same month
    as the current-date (sysdate). All I get is the first day of the month. In an attempt to figure this out I added the
    sequence "n". To my surprise the recursion is subtracting instead of adding the one day each time.
    with
      date_list ( n, crnt_mnth_date )  as
        ( select  1,  cast ( trunc(sysdate,'MM') as date )  from dual
          UNION ALL
          select  n+1,  crnt_mnth_date + (interval '1' day)  as crnt_mnth_date
            from  date_list
           where  n < 9
    select  *  from  date_list ;And... Changing the "+" to a "-" still subtracts one day each time -- no change.
    Obvious BUG? Or am I just confused on how this works?

    Hi,
    I've heard that the new recursive WITH clause feature is buggy, especially when DATEs are involved.
    I get the same (unexpected) results that you do.
    A very similar query, using only NUMBERs, does wotk as expected:
    with
      date_list ( n, crnt_mnth_num )  as
        ( select  1,  20010501   from dual
          UNION ALL
          select  n+1,  crnt_mnth_num + 1  as crnt_mnth_num
            from  date_list
           where  n < 9
    select  *  from  date_list ;Outptu:
    `       N CRNT_MNTH_NUM
            1      20010501
            2      20010502
            3      20010503
            4      20010504
            5      20010505
            6      20010506
            7      20010507
            8      20010508
            9      20010509

  • SQL+-MULTI TABLE QUERY PROBLEM

    HAI ALL,
    ANY SUGGESTION PLEASE?
    SUB: SQL+-MULTI TABLE QUERY PROBLEM
    SQL+ QUERY GIVEN:
    SELECT PATIENT_NUM, PATIENT_NAME, HMTLY_TEST_NAME, HMTLY_RBC_VALUE,
    HMTLY_RBC_NORMAL_VALUE, DLC_TEST_NAME, DLC_POLYMORPHS_VALUE,
    DLC_POLYMORPHS_NORMAL_VALUE FROM PATIENTS_MASTER1, HAEMATOLOGY1,
    DIFFERENTIAL_LEUCOCYTE_COUNT1
    WHERE PATIENT_NUM = HMTLY_PATIENT_NUM AND PATIENT_NUM = DLC_PATIENT_NUM AND PATIENT_NUM
    = &PATIENT_NUM;
    RESULT GOT:
    &PATIENT_NUM =1
    no rows selected
    &PATIENT_NUM=2
    no rows selected
    &PATIENT_NUM=3
    PATIENT_NUM 3
    PATIENT_NAME KKKK
    HMTLY_TEST_NAME HAEMATOLOGY
    HMTLY_RBC_VALUE 4
    HMTLY_RBC_NORMAL 4.6-6.0
    DLC_TEST_NAME DIFFERENTIAL LEUCOCYTE COUNT
    DLC_POLYMORPHS_VALUE     60
    DLC_POLYMORPHS_NORMAL_VALUE     40-65
    ACTUAL WILL BE:
    &PATIENT_NUM=1
    PATIENT_NUM 1
    PATIENT_NAME BBBB
    HMTLY_TEST_NAME HAEMATOLOGY
    HMTLY_RBC_VALUE 5
    HMTLY_RBC_NORMAL 4.6-6.0
    &PATIENT_NUM=2
    PATIENT_NUM 2
    PATIENT_NAME GGGG
    DLC_TEST_NAME DIFFERENTIAL LEUCOCYTE COUNT
    DLC_POLYMORPHS_VALUE     42
    DLC_POLYMORPHS_NORMAL_VALUE     40-65
    &PATIENT_NUM=3
    PATIENT_NUM 3
    PATIENT_NAME KKKK
    HMTLY_TEST_NAME HAEMATOLOGY
    HMTLY_RBC_VALUE 4
    HMTLY_RBC_NORMAL 4.6-6.0
    DLC_TEST_NAME DIFFERENTIAL LEUCOCYTE COUNT
    DLC_POLYMORPHS_VALUE     60
    DLC_POLYMORPHS_NORMAL_VALUE     40-65
    4 TABLES FOR CLINICAL LAB FOR INPUT DATA AND GET REPORT ONLY FOR TESTS MADE FOR PARTICULAR
    PATIENT.
    TABLE1:PATIENTS_MASTER1
    COLUMNS:PATIENT_NUM, PATIENT_NAME,
    VALUES:
    PATIENT_NUM
    1
    2
    3
    4
    PATIENT_NAME
    BBBB
    GGGG
    KKKK
    PPPP
    TABLE2:TESTS_MASTER1
    COLUMNS:TEST_NUM, TEST_NAME
    VALUES:
    TEST_NUM
    1
    2
    TEST_NAME
    HAEMATOLOGY
    DIFFERENTIAL LEUCOCYTE COUNT
    TABLE3:HAEMATOLOGY1
    COLUMNS:
    HMTLY_NUM,HMTLY_PATIENT_NUM,HMTLY_TEST_NAME,HMTLY_RBC_VALUE,HMTLY_RBC_NORMAL_VALUE     
    VALUES:
    HMTLY_NUM
    1
    2
    HMTLY_PATIENT_NUM
    1
    3
    MTLY_TEST_NAME
    HAEMATOLOGY
    HAEMATOLOGY
    HMTLY_RBC_VALUE
    5
    4
    HMTLY_RBC_NORMAL_VALUE
    4.6-6.0
    4.6-6.0
    TABLE4:DIFFERENTIAL_LEUCOCYTE_COUNT1
    COLUMNS:DLC_NUM,DLC_PATIENT_NUM,DLC_TEST_NAME,DLC_POLYMORPHS_VALUE,DLC_POLYMORPHS_
    NORMAL_VALUE,
    VALUES:
    DLC_NUM
    1
    2
    DLC_PATIENT_NUM
    2
    3
    DLC_TEST_NAME
    DIFFERENTIAL LEUCOCYTE COUNT
    DIFFERENTIAL LEUCOCYTE COUNT
    DLC_POLYMORPHS_VALUE
    42
    60
    DLC_POLYMORPHS_NORMAL_VALUE
    40-65
    40-65
    THANKS
    RCS
    E-MAIL:[email protected]
    --------

    I think you want an OUTER JOIN
    SELECT PATIENT_NUM, PATIENT_NAME, HMTLY_TEST_NAME, HMTLY_RBC_VALUE,
    HMTLY_RBC_NORMAL_VALUE, DLC_TEST_NAME, DLC_POLYMORPHS_VALUE,
    DLC_POLYMORPHS_NORMAL_VALUE
    FROM PATIENTS_MASTER1, HAEMATOLOGY1,  DIFFERENTIAL_LEUCOCYTE_COUNT1
    WHERE PATIENT_NUM = HMTLY_PATIENT_NUM (+)
    AND PATIENT_NUM = DLC_PATIENT_NUM (+)
    AND PATIENT_NUM = &PATIENT_NUM;Edited by: shoblock on Nov 5, 2008 12:17 PM
    outer join marks became stupid emoticons or something. attempting to fix

  • Recursive sql-query?

    got a question about doing a recursive sql-query:
    i've table containing the employee's number pnr and the superior's number vnr, who's also an employee.
    my task is to get all numbers of the direct and indirect superior of a certain employee(e.g. pnr=123), meaning the result set should contain the superior's number, the superior's superior's number etc. until the superior's number is NULL.
    is it possible to do that in a simple sql query?
    starting:
    select vnr
    from staff
    where pnr = 123
    i don't want to write a loop using java and jdbc.
    thanks in advance.

    got a question about doing a recursive sql-query:
    i've table containing the employee's number pnr and the superior's number vnr, who's also an employee.
    my task is to get all numbers of the direct and indirect superior of a certain employee(e.g. pnr=123), meaning the result set should contain the superior's number, the superior's superior's number etc. until the superior's number is NULL.
    is it possible to do that in a simple sql query?
    starting:
    select vnr
    from staff
    where pnr = 123Try to use
    select pnr
    from staff
    CONNECT BY prior vnr=pnr
    START WITH pnr=123;
    i don't want to write a loop using java and jdbc.
    thanks in advance.

  • Is it possible to implement Recursive CTE query in MDX to Cube dataset?

    I have data with hierarchical relationship like this:
    Release -> Features -> PBI/Bugs -> Tasks/Test Case. I have two datasets Work Item and Work Item Linked to get this hierarchical information.
    The data looks like this:
    Something like if I pass a Release ID, I need to get all the children and sub-children also. Basically a report like this:
    I did this by implementing a recursive CTE query with warehouse tables. But it takes more time to load. SO trying to find the possibility using MDX and querying the cube datasets

    Hello,
    There is nothing stopping you from querying the cache to see what is in it. However, this will only take into account items that are already in the cache. If you need a query to return items that are potentially not in the cache, you need to query the database, have the query return keys, and then request those keys through Coherence - which will in turn pull the items from the database as needed.
    Regards,
    -Dave

  • Recursive/Hierarchical Query

    Hello,
    I am trying to solve a problem that needs the use of recursive queries (more precisely the "connect by" clause). I have the following P table:
    P1 P2
    a1 a2
    a1 a3
    a2 a4
    a3 a5
    a4 a6
    The result of my query should be:
    P1 P2
    a1 a2
    a1 a3
    a1 a4
    a1 a5
    a1 a6
    a2 a4
    a2 a6
    As you can see, I am trying to get all the children, grandchildren, etc of every P1, going to the deepest level possible, following the transitivity property (if a1-a2, and a2-a4, then "a1 a4" will be part of the solution). The following query
    select distinct P1, P2 from P
    connect by P2 = prior P1
    order by P1
    gives me only the first level of inclusions (a1 a2, a1 a3, a2...), but I need all of them. How can I solve the problem?
    Thank you!

    In a 10g environment you can use the CONNECT_BY_ROOT operatory to get the root node:
    WITH P AS (SELECT 'a1' P1,'a2' P2 FROM DUAL
       UNION ALL SELECT 'a1', 'a3' FROM DUAL
       UNION ALL SELECT 'a2', 'a4' FROM DUAL
       UNION ALL SELECT 'a3', 'a5' FROM DUAL
       UNION ALL SELECT 'a4', 'a6' FROM DUAL
    SELECT DISTINCT CONNECT_BY_ROOT P1 P1, P2
      FROM P CONNECT BY P1 = PRIOR P2
    ORDER BY P1,P2
    P1 P2
    a1 a2
    a1 a3
    a1 a4
    a1 a5
    a1 a6
    a2 a4
    a2 a6
    a3 a5
    a4 a6
    9 rows selected

  • Reg: Query Problem for New Posting Period

    Hi Xperts,
    While I try to Map the A/P Invoices with their respective Outgoing Payment,
    I used the following Query and it's Query Printlayout
    SELECT T0.DocNum [Payment#], T0.DocDate [Payment Date],
    T0.CardCode, T0.CardName, T1.InvoiceId, T2.DocNum [AP Inv#],
    T2.NumatCard [Bill No.], T2.DocDate [Bill Date], T1.selfInv,
    T1.SumApplied, T1.WtAppld, T0.NoDocsum 
    FROM  [dbo].[OVPM] T0  INNER  JOIN
    [dbo].[VPM2] T1  ON  T1.[DocNum] = T0.DocNum
    INNER  JOIN [dbo].[OPCH] T2  ON  T2.[DocEntry] = T1.DocEntry
    WHERE T0.Cardname='[%0]' and T0.DocDate='[%1]' and
    T0.DocNum='[%2]'
    I got the above query from our Expert Mr.Sambath only.
    Now what is the problem is the query is retrieving the payment details of old Posting Period only and not the current posting period.
    In detail, I used 'Primary' Series for FY08-09, Period indicator 'Default'
    Now I'm using 'Primary1' Series for FY09-10, Period indicator '0910'
    Thanx in adv.
    Regards,
    Bala

    Hi Bala,
    Looking at your query, it is not query issue ,it is your data issue.
    Please check if you have data in  VPM2  table  which is bank transfer payment method
    Thank you
    Bishal
    Edited by: Bishal Adhikari on Apr 9, 2009 8:48 AM

  • VIEW Query Problem

    Hi Greg,
    I had created a view on a table which doesn't have Primary Key, but it has Unique and Not Null constraints on required columns.
    I had wrote a procedure to query the data on VIEW. I have experienced strange problem, very first call to procedure will take more time than succeeding requests. For example from second request onwards, it returns data in < 2 Sec, but first transaction is taking 12 Sec to 30 Sec.
    I thought that very first time VIEW is taking time to refresh it self. So, I added FORCE keyword in CREATE VIEW stattement. However, that doesn't helped out.
    In my further investigation I came to know that base table on which VIEW created, has to be loaded in to memory before querying on VIEW.
    So, I had executed a simple select statement on base table, before I execute VIEW query in procedure.
    With this change I got results consistently < 2 Sec all the times.
    My question is instead of executing the select statement on base table is there a way to load base tables data in memory before querying on VIEW?
    Thanks,
    Subbarao

    Hi,
    A view is nothing but parsed SQL statements stored in the database, a view may or may not run faster. If you execute the SQL used to define the view how much time is it taking. If you want try looking at MATERIALIZED VIEW , that may help you.
    thanks

  • Date range query  problem  in report

    Hi all,
    I have created a report based on query and i want to put date range selection but query giving problem.
    If i am creating select list selection then it is working fine means it will display all records on the particular date.
    But what i need is that user will enter date range as creation_date1,creation_date2 and query should return all the records between these date range. i want to pass it by creating items, i created two items and passing creation_date range to display all records but not displaying and if not passing date then should take null as default and display all records
    Here is the query:
    /* Formatted on 2006/12/10 20:01 (Formatter Plus v4.8.0) */
    SELECT tsh."SR_HEADER_ID", tsh."SALES_DEPT_NUMBER", tsh."COUNTRY",
    tsh."LOCAL_REPORT_NUMBER", tsh."ISSUE_DATE", tsh."SUBJECT",
    tsh."MACHINE_SERIAL_NUMBER", tsh."MACHINE_TYPE", tsh."MACHINE_HOURS",
    tsh."STATUS"
    FROM "TRX_SR_HEADERS" tsh, "TRX_SR_PARTS" tsp
    WHERE (tsh.status LIKE :p23_status_sp OR tsh.status IS NULL)
    AND (tsh.machine_type LIKE :p23_machine_type_sp)
    AND ( tsh.machine_serial_number LIKE
    TO_CHAR (:p23_machine_serial_number_sp)
    OR tsh.machine_serial_number IS NULL
    AND ( TO_CHAR (tsh.failure_date, 'DD-MON-YY') LIKE
    TO_CHAR (:p23_failure_date_sp)
    OR TO_CHAR (tsh.failure_date, 'DD-MON-YY') IS NULL
    AND ( TO_CHAR (tsh.creation_date, 'DD-MON-YY')
    BETWEEN TO_CHAR (:p23_creation_date_sp)
    AND TO_CHAR (:p23_creation_date_sp1)
    OR TO_CHAR (tsh.creation_date, 'DD-MON-YY') IS NULL
    AND (tsh.issue_date LIKE :p23_date_of_issue_sp OR tsh.issue_date IS NULL)
    AND (tsh.country LIKE :p23_country_sp OR tsh.country IS NULL)
    AND ( tsh.local_report_number LIKE TO_CHAR (:p23_local_rep_num_sp)
    OR tsh.local_report_number IS NULL
    AND ( tsp.part_number LIKE TO_CHAR (:p23_part_number_sp)
    OR tsp.part_number IS NULL
    AND tsh.machine_type IN (
    SELECT DISTINCT machine_type
    FROM trx_sales_dept_machine_list
    WHERE sales_department_id IN (
    SELECT DISTINCT sales_department_id
    FROM trx_user_sales_department
    WHERE UPPER (user_name) =
    UPPER ('&APP_USER.'))
    AND SYSDATE >= valid_from)
    AND tsh.sr_header_id = tsp.sr_header_id
    can any one tell me wat is wroung in this query.
    Any other way to write this?
    Thank You,
    Amit

    Hi User....
    Here is some date range SQL that my teams uses with some success:
    For date columns that do not contain NULL values, try this (note the TRUNC, it might help with your "today" problem).
    The hard coded dates allow users to leave the FROM and TO dates blank and still get sensible results (ie a blank TO date field asks for all dates in the future.
    AND TRUNC(DATE_IN_DATABASE)
    BETWEEN
    decode( :P1_DATE_FROM,
    TO_DATE('01-JAN-1900'),
    :P1_DATE_FROM)
    AND
    decode( :P1_DATE_TO,
    TO_DATE('31-DEC-3000'),:
    :P1_DATE_TO)
    For date columns that contain NULL values, try this (a little bit trickier):
    AND nvl(TRUNC(DATE_IN_DATABASE),
    decode( :P1_DATE_FROM,
    decode( :P1_DATE_TO,
    TO_DATE('30-DEC-3000'),
    NULL),
    NULL)
    BETWEEN
    decode( :P1_DATE_FROM,
    TO_DATE('01-JAN-1900'),
    :P1_DATE_FROM)
    AND
    decode( :P1_DATE_TO,
    TO_DATE('31-DEC-3000'),
    :P1_DATE_TO)
    Note the 30-DEC-3000 versus 31-DEC-3000. This trick returns the NULL dates when the FROM and TO date range items are both blank.
    I hope this helps.
    By the way, does anyone have a better way of doing this? The requirement is given a date column in a database and a FROM and a TO date item on a page,
    find all of the dates in the database between the FROM and TO dates. If the FROM date is blank, assume the user want all dates in the past (excluding NULL dates). If the TO date is blank, assume that the user wants all of the dates in the future (excluding NULL dates). If both FROM and TO dates are blank, return all of the dates in the databse (including NULL dates).
    Cheers,
    Patrick

  • Multiprovider Query Problem

    Hi Gurus,
    The scenario is that there are 2 inficubes, one with order data and other with delivery data. The cube with order data has the requested delivery date and the delivery cube has the actual delivery date. The problem is that I have a query on a multiprovider (on top of the 2 cubes). So when I output the query data by the sales order number, the result is fine, but when I drill down on any of the dates mentioned above ( they are free characteristics in the query), the result splits up into 2 records. For Eg.
    Sales Order     Req Del Date  Act Del Date  Order Qty  Shipped Qty
    12345               03/03/08         -                    5                 -
                                   -           06/03/08            -                5
    What can I do to get the result in one row?
    I will reward points for any help.
    Thanks

    This is the behavior of the multiprovider, since the actual goods issue date is not part of the orders cube, then it will create a second record. There are a couple solutions you could get around to this:
    1. You could merge the data in one DSO before you actually load it to the data target. To do this, you could update fields you need to the orders ods from the delivery ods.
    2. You could create an infoset between the two cubes if you are in 7.0, otherwise, you could create infoset using the underlying ods and create a query from the infoset: performance wise this is not recommended.
    3. If you want to solve the issue report level, there is what is called constant selection and you can make the actual goods issue date as a constant selection and you can get one line.
    /people/prakash.darji/blog/2006/09/19/the-hidden-secret-of-constant-selection
    I would recommend the last option,
    thanks.
    Wond

  • Out standing MIS Report query problem.

    Hi,
    We designed MIS Report for outstanding mis through Crystal report.here we are facing probleme.ex:AR invoice raised on 01 Jan 09 bill amount 1000 and for this client is received full amount against that bill on 04 march09.in this report we provided parameters for from date and to date. When user selected in parameter from date 010109 to 050309 it will show pending amount is 0.but users are asking if they select from date upto 030309 means it will show pending amount should be show 1000.in this query we are retrieving based on document status when open. How we can show report for this requirements. Please guide me.if we give docstatus='O' or docstatus= 'C' it's showing but pending amount =Bill amount - paid amount here it's showing 0 i think here also we need to pass incoming payment docdate.how wen do please guide me.
    below this is the query.
    set @FromYear=case when month(@ToDate)>=1 and month(@ToDate)<=3 then Year(@ToDate)-1 else Year(@ToDate) end
    set @ToYear=case when month(@ToDate)>=1 and month(@ToDate)<=3 then Year(@ToDate) else Year(@ToDate)+1 end
    --select @fromYear,@toyear,@todate,@ProjCode,@Cardcode,@VoucherType,@GroupName
    select a.u_category,a.docdate,g.name,d.CardCode,d.cardname,e.GroupName,SUBSTRING(CONVERT(VARCHAR(11), a.docdate, 113), 4, 8)as Month of invoiceraised,
    b.seriesname,a.docnum,a.Project,0,a.doctotal,
    paidamount= case when a.paidtodate is NULL then 0 else a.paidtodate end,
    pendingamount= case when isnull(a.doctotal,0)-isnull(a.paidtodate,0) is null then 0 else isnull(a.doctotal,0)-isnull(a.paidtodate,0) end,
    case when year(a.docdate) = @ToYear and month(a.docdate) = 3 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as March ,
    case when year(a.docdate) = @ToYear and month(a.docdate) = 2 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as Feb,
    case when year(a.docdate) = @ToYear and month(a.docdate) = 1 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as Jan,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 12 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as Dec,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 11 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as Nov,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 10 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as Oct,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 9 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as Sept,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 8 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as Aug,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 7 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as July,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 6 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as June,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 5 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as May,
    case when year(a.docdate) = @FromYear and month(a.docdate) = 4 then isnull(a.doctotal,0)-isnull(a.paidtodate,0) else 0 end as April,
    --case when a.docdate = (select f_refdate from ofpr where year(f_refdate)=year(a.refdate) then a.doctotal-c.paidtodate else 0 end as Pre-Yr
    nodocsum=isnull(f.nodocsum,0),0 as PreviousFY
    from oinv a
    left join nnm1 b on a.series=b.series
    inner join INV1 c ON a.DocEntry = c.DocEntry
    inner join OCRD d ON d.CardCode=a.CardCode
    left join ocpr g on g.cardcode=d.cardcode
    Inner join OCRG e on e.GroupCode=d.GroupCode and e.grouptype='c'
    LEFT JOIN ORCT f ON a.DocEntry = f.DocEntry
    where
    a.docstatus='O' and
    case when a.doctotal-a.paidtodate is null then 0 else a.doctotal-a.paidtodate end >= 0
    Reds,
    Sampath kumar devunuri.

    Hi,Gordon Du ,
    We are designing through Crystal reports 2008 only. Based on SQL query how we can maintain History of Document status and date in table. Please give me your advise how we can rectify this problem. Kindly find above query.
    Regds,
    Sampath Kumar.

  • Query problem with accumulated key figures

    Hi BI Gurus!
    I have a report problem that I hope you can help me with!
    In my report I have 2 key figures. One for accumulated revenue previous year (KF1) and one for accumulated revenue current year (KF2). Both key figures should be presented in a graph in monthly buckets.
    January figures from both the key figures shoule be presented in the same bucket. Therfore I can't use 0CALYEAR since we have the "year" information in there. Instead I'm using 0CALMONTH2 which is only two digits, 01 for January. That way I can map figures from both previous year and current year in the same bucket.
    I need the figures to be accumulated and this is what I have problem with. When I run the report today in February 2010 it looks like this:
    Month   KF1   KF2
    01        10     15
    02        10     20
    03        15    
    04        10    
    05        20    
    06        10    
    07        10    
    08        15    
    09        15    
    10        20    
    11        20    
    12        10    
    This is how I would like the report to look like:
    Month   KF1   KF2
    01        10     15
    02        20     35
    03        35    
    04        45    
    05        65    
    06        75    
    07        85    
    08        100    
    09        115    
    10        135    
    11        155    
    12        165
    I have tried to use the setting "accumulated" for the key figures but then I get this result:
    Month   KF1   KF2
    01        10     15
    02        20     35
    03        35     35
    04        45     35
    05        65     35
    06        75     35
    07        85     35
    08        100   35
    09        115   35
    10        135   35
    11        155   35
    12        165   35
    Since the KF2 is revenue for current year and I run the report in February I don't want any figures to be displayed in Mars...
    I have tried to restrict the key figures by 0CALMONTH2 and 0CALYEAR. The KF1 is havein a restriction to only show values for 0CALYEAR - 1 and an interval for 0CALMONTH2 from JAN - DEC.
    The KF2 is having a restriction to only show values in the interval "first month in year - current month" (in this example JAN - FEB) for 0CALMONTH2. And current year for 0CALYEAR.
    Despite my restrictions for KF2 the numpers repeats itself for every month...
    Any suggestion how I can resolve this?
    Best regards
    Anders Florin

    Hi Khaled and thank you for trying to help me!
    I agree with you and think the users should accept the report as it is. But they are claiming that top management will not accept this and they would really want this to be fixed the whay that they want. I have tried to push back on this and said that I'm not sure that it can be resoleved and that it could cost them a lot of money if I try.
    But I will try to resolve it for them if I have spare time in the end of the project. I have not promised them anything but it would really be nice if I could fix it.
    So when you say I need to use a structure and a calculated key figure. How should the calculated key figure and the structure be configured?
    If I use a structure in the rows I guess I can't use same object in calc.key.figure right? Like if I use 0CALMONTH2 in the structure I'm not able to restrict the key figure with the same object? If that is correct I also have a ZMONTH object, different story why I have that... , that I can use in the same way as 0CALMONTH2. Or is this only a problem when I use "local" formulas within the query and not using a "global" calculated key figure? Cause I have only used the "loacal" formula calculated key figure in this report....
    Br
    Anders

  • Abap select query problem

    This report will take delivery document number and delivery date from user and fetches details from delivery table and fetches
    corresponding sales order details and billing details  and displays sales order details with ALV list.
    << Please only post the relevant portions of your code >>
    i just want to know that is this way of fetching the data into internal table okay ?are there any better ways of fetching the data into the internal table ? why  is it looping in work area of lips, why not in likp?
    (plz dont use field-symbols or oo abap or macros) I WANT TO USE PLAIN AND SIMPLE ABAP STATEMENTS LIKE ABOVE..
    By using "vbeln type lips-vbeln" are we refering to the field or data element? plz suggest.
    P.S.           [my approach was to inner join likp and lips into itab(my internal table).
    select data from kna1, vbak,vbap,vbrp into respective internal tables like it_kna1,it_vbak etc.
    then using individual loops into the tables, i would use read table to insert data into itab(my final internal table) plz suggest which method wud be more efficient? ]
    Edited by: Rob Burbank on Jun 8, 2009 11:54 AM

    ok i am posting the select queries once again.
    i want to know why are we looping in t_lips and why not t_likp? bcoz tlikp is the header table, if we loop thru it and then read the rest tables then what will be the problem? plz clarify with examples._
    [my idea was to loop at t_likp then read t_lips.append the lips data into t_order(main internal table).then do read table on t_kna1,t_vbap etc indexing t_order. so plz suggest whether my approach was write or wrong?if wrong why?plz site any other ways of doing this query.
    types: begin of ty_vbap,
           vbeln type vbap-vbeln,
           posnr type vbap-posnr, .....
    does the declaration statement in types refer to tables or data elements? what is the difference if we declare it like:
       types: begin of ty_vbap,
           vbeln type vbeln,
           posnr type posnr, .....
    select-options:
    s_deldoc FOR likp-vbeln, " Delivery
    s_dldate FOR likp-lfdat. " Delivery Date
    Get delivery document number,delivery date,customer number from
    delivery header table
    SELECT vbeln " Delivery
    lfdat " Delivery Date
    kunnr " Customer Number 1
    FROM likp
    INTO TABLE t_likp
    WHERE vbeln IN s_deldoc
    AND lfdat IN s_dldate.
    IF sy-subrc EQ 0.
    Get Customer name for customer numbers from Customer master table
    SELECT kunnr " Customer Number 1
    name1 " Name 1
    FROM kna1
    INTO TABLE t_kna1
    FOR ALL ENTRIES IN t_likp
    WHERE kunnr EQ t_likp-kunnr.
    IF sy-subrc EQ 0.
    Get delivery item number,sales document number,sales item number,
    delivery quantity from delivery item table
    SELECT vbeln " Delivery
    posnr " Delivery Item
    vgbel " Document number of
    " reference document
    vgpos " Item number of reference item
    lfimg " Actual quantity delivered
    vrkme " Sales unit
    FROM lips
    INTO TABLE t_lips
    FOR ALL ENTRIES IN t_likp
    WHERE vbeln EQ t_likp-vbeln.
    IF sy-subrc EQ 0.
    Get sales document number,item number,material,material description,
    ordered quantity from sales item table
    SELECT vbeln " Sales Document
    posnr " Sales Document Item
    matnr " Material Number
    arktx " Short text for sales order
    " item
    kwmeng " Cumulative Order Quantity
    vrkme " Sales unit
    FROM vbap
    INTO TABLE t_vbap
    FOR ALL ENTRIES IN t_lips
    WHERE vbeln EQ t_lips-vgbel
    AND posnr EQ t_lips-vgpos.
    IF sy-subrc EQ 0.
    Get sales document number ,created date,purchase order number from
    sales header table
    SELECT vbeln " Sales Document
    erdat " Date on Which Record Was" Created
    aufnr " Order Number
    FROM vbak
    INTO TABLE t_vbak
    FOR ALL ENTRIES IN t_lips
    WHERE vbeln EQ t_lips-vgbel.
    IF sy-subrc EQ 0.* Get billing document number,billing item,reference delivery document
    number,delivery item number,billing item from billing item table
    SELECT vbeln " Billing Document
    posnr " Billing item
    vgbel " Document number of the
    " reference document
    vgpos " Item number of the" reference" item
    fklmg " Billing quantity in" stockkeeping unit
    vrkme " Sales unit
    FROM vbrp
    INTO TABLE t_vbrp
    FOR ALL ENTRIES IN t_lips
    WHERE vgbel EQ t_lips-vbeln
    AND vgpos EQ t_lips-posnr.
    ENDIF. " IF SY-SUBRC EQ 0
    ENDIF. " IF SY-SUBRC EQ 0
    ENDIF. " IF SY-SUBRC EQ 0
    ENDIF. " IF SY-SUBRC EQ 0
    ELSE.
    Display message if records are not found for entered values
    MESSAGE S000.
    EXIT.
    ENDIF. " IF SY-SUBRC EQ 0
    Looping Delivery item internal table to assign values to order
    internal table
    LOOP AT t_lips INTO fs_lips.
    Get delivery date and customer number for delivery document number
    from delivery header internal table
    READ TABLE t_likp WITH KEY vbeln = fs_lips-vbeln
    INTO fs_likp.
    Get customer name for customer number from customer master internal
    table
    IF sy-subrc EQ 0.
    READ TABLE t_kna1 WITH KEY kunnr = fs_likp-kunnr
    INTO fs_kna1.
    Get sales document number,item number,ordered quantity for delivery
    document number,item number from sales item internal table
    IF sy-subrc EQ 0.
    READ TABLE t_vbap WITH KEY vbeln = fs_lips-vgbel
    posnr = fs_lips-vgpos INTO fs_vbap.
    Get goods issue date and purchase order number for sales document
    number from sales header internal table
    IF sy-subrc EQ 0.
    READ TABLE t_vbak WITH KEY vbeln = fs_vbap-vbeln INTO fs_vbak.
    IF sy-subrc EQ 0.
    Get billing document number,billing item,billing quantity for delivery
    document number,delivery item number from billing item internal table
    READ TABLE t_vbrp WITH KEY vgbel = fs_lips-vbeln
    vgpos = fs_lips-posnr INTO fs_vbrp.
    Assign sales,delivery,billing fields into respective fields of sales
    order internal table
    IF sy-subrc EQ 0.
    fs_order-vbeln = fs_vbap-vbeln.
    fs_order-posnr = fs_vbap-posnr.
    fs_order-erdat = fs_vbak-erdat.
    fs_order-kunnr = fs_likp-kunnr.
    fs_order-name1 = fs_kna1-name1.
    fs_order-aufnr = fs_vbak-aufnr.
    fs_order-matnr = fs_vbap-matnr.
    fs_order-arktx = fs_vbap-arktx.
    fs_order-kwmeng = fs_vbap-kwmeng.
    fs_order-vrkme = fs_vbap-vrkme.
    fs_order-vbeln1 = fs_lips-vbeln.
    fs_order-posnr1 = fs_lips-posnr.
    fs_order-lfimg = fs_lips-lfimg.
    fs_order-vrkme1 = fs_lips-vrkme.
    fs_order-vbeln2 = fs_vbrp-vbeln.
    fs_order-posnr2 = fs_vbrp-posnr.
    fs_order-fklmg = fs_vbrp-fklmg.
    fs_order-vrkme2 = fs_vbrp-vrkme.
    APPEND fs_order TO t_order.
    CLEAR fs_order.
    ENDIF. " IF SY-SUBRC EQ 0
    ENDIF. " IF SY-SUBRC EQ 0
    ENDIF. " IF SY-SUBRC EQ 0
    ENDIF. " IF SY-SUBRC EQ 0
    ENDIF. " IF SY-SUBRC EQ 0
    ENDLOOP. " LOOP AT T_LIPS INTO FS_LIPS

Maybe you are looking for

  • Windows 8.1 install

    Microsoft wants to install windows 8.1 again, and it seems there's nothing I can do to stop it!  I can delay it for a very short time, but don't know how to stop it.  Why do I want to stop it?  Because the last 2 times it installed itself after it fi

  • USE of  DBMS_STATS

    Hi All I want to use the dbms_stats package to gather the statistics EXEC DBMS_STATS.EXPORT_SCHEMA_STATS ( ownname => 'SCOTT', stattab => 'DBSTATS', statid => 'SCOTT' || '_' || TO_CHAR(SYSDATE,'MMDDYYYY'), statown => 'DB_MONITOR'); In the above synta

  • Site Collection level Search Scopes after Upgraded to 2013

    In SharePoint 2010 we have  good amount of site collection level search scopes and it has been heavily used in search scope down. Please correct me if any of my below statement is wrong 1.After migration these scopes cannot be used and it will not ap

  • Change the ringtone on external calls

    Hi all, Working with a SPA 525G. Looking to change the ringtone when any external call comes through the VOIP Phone. Can the SPA 525G do that? For example: I call our office from my cell, it identifies it as an external number to the site, and a diff

  • TO BBERKOW and ALL oracle8i on suse 6.4

    TO BBERKOW: the document you told me helped me but when i use dbassist the assistent dont'see cdrom! but it's not the truth because I can navigate by term on it without problem! I have tried to install redHat 6.1 but j need to upgrade Xfree to 3.3.6