PL/SQL loop counter for Xpath

I have an XML file that looks like this...
<COL-COMPET_LNG>
<COMPET_LNG>
<LNG_CODE>3</LNG_CODE>
<READ>O</READ>
<WRITE>O</WRITE>
<SPEAK>O</SPEAK>
<UNDERSTAND>O</UNDERSTAND>
</COMPET_LNG>
<COMPET_LNG>
<LNG_CODE>4</LNG_CODE>
<READ>O</READ>
<WRITE>N</WRITE>
<SPEAK>O</SPEAK>
<UNDERSTAND>O</UNDERSTAND>
</COMPET_LNG>
<COMPET_LNG>
<LNG_CODE>1</LNG_CODE>
<READ>O</READ>
<WRITE>N</WRITE>
<SPEAK>O</SPEAK>
<UNDERSTAND>O</UNDERSTAND>
</COMPET_LNG>
<COMPET_LNG>
<LNG_CODE>5</LNG_CODE>
<READ>O</READ>
<WRITE>N</WRITE>
<SPEAK>O</SPEAK>
<UNDERSTAND>O</UNDERSTAND>
</COMPET_LNG>
</COL-COMPET_LNG>
Using PLSQL I would like to loop though each node and process the /LNG_CODE value. I know how to set up the loop and how to access the /LNG_CODE values for each node. I am not sure how to count the number of occurrences of each <COMPET_LNG> node so that I can use it for my max count on the loop. Can anyone help?
Is there a good reference book I can use for this type of PL/SQL programming with XPath? I am using the Oracle manuals but I find the examples a little sparse and would love to read something with some good example code.
Thanks
Karen

Chris,
Thanks for the help. I now have a loop that works but I am not sure how to extract my data. I have tried...
declare
xml xmltype;
v_other_language VARCHAR2(40);
BEGIN
SELECT ccv_xml INTO xml FROM ccv_xml;
FOR i IN (SELECT value(x) FROM TABLE(XMLSEQUENCE(EXTRACT(xml,'/CV/COL-COMPET_LNG/COMPET_LNG'))) x)
LOOP
SELECT EXTRACTVALUE(xml,'/CV/COL-COMPET_LNG/COMPET_LNG/LNG_CODE')
INTO v_other_language
FROM dual
WHERE EXTRACTVALUE(xml,'/CV/COL-COMPET_LNG/COMPET_LNG/LNG_CODE[i]') > 2;
dbms_output.put_line('Looping'||v_other_language);
END LOOP;
dbms_output.put_line('END');
END;
But my counter 'i' does not seem to be an integer. I get the error message ORA-01403: no data found with this option. I thought I might have access to value(x) in the loop but I don't have that either. How can I access the data that I have now isolated for my loop? I am lost and I can't find an example in the Oracle XML manual.
Thanks for your help
Karen

Similar Messages

  • Loop counter reset in parallel model ?

    Hello,
    i am using TestStand 3.1 with parallel model. There is a loop counter for each UUT in RunState.Root.Parameters.TestSocket.UUT.UUTLoopIndex. This increases with every loop that is done.
    Now my problem is: If i start the NextUUT, this counter is not set to 0. It just increases.
    Is there a different counter that i can use ? Or where can i get the information that the NextUUT button is pressed so that i can reset the counter manually ? Or is there another solution.
    Thanks for Help.

    Hi,
    I don't completely understand, why you want to reset the UUTLoopIndex, because it shows the number of iterations per test socket to check how many uut's have been tested on each. However, you could reset the value with a simple statement before you start the tests. You could do this in the setup step group, e.g. with RunState.Root.Parameters.TestSocket.UUT.UUTLoopIndex = 0. You could add a message popup or evaluate an extra condition or so.
    Kind regards,
    Philippe Goetz,
    Applications Engineer, National Instruments

  • Using FOR .. LOOP counter in handling of PL/SQL procedures with nest. table

    Hi all!
    I'm learning PL/SQL on Steve Bobrovsky's book (specified below sample is from it) and I've a question.
    In the procedure of specified below program used an integer variable currentElement to get reference to the row of nested table of %ROWTYPE datatype.
    Meanwhile, the program itself uses a common FOR .. LOOP counter i.
    DECLARE
    TYPE partsTable IS TABLE OF parts%ROWTYPE;
    tempParts partsTable := partsTable();
    CURSOR selectedParts IS
      SELECT * FROM parts ORDER BY id;
    currentPart selectedParts%ROWTYPE;
    currentElement INTEGER;
    PROCEDURE printParts(p_title IN VARCHAR2, p_collection IN partsTable) IS
      BEGIN
       DBMS_OUTPUT.PUT_LINE(' ');
       DBMS_OUTPUT.PUT_LINE(p_title || ' elements: ' || p_collection.COUNT);
       currentElement := p_collection.FIRST;
       FOR i IN 1 .. p_collection.COUNT
       LOOP
        DBMS_OUTPUT.PUT('Element #' || currentElement || ' is ');
         IF tempParts(currentElement).id IS NULL THEN DBMS_OUTPUT.PUT_LINE('an empty element.');
         ELSE DBMS_OUTPUT.PUT_LINE('ID: ' || tempParts(currentElement).id || ' DESCRIPTION: ' || tempParts(currentElement).description);
         END IF;
        currentElement := p_collection.NEXT(currentElement);
       END LOOP;
    END printParts;
    BEGIN
    FOR currentPart IN selectedParts
    LOOP
      tempParts.EXTEND(2);
      tempParts(tempParts.LAST) := currentPart;
    END LOOP;
    printParts('Densely populated', tempParts);
    FOR i IN 1 .. tempParts.COUNT
    LOOP
      IF tempParts(i).id is NULL THEN tempParts.DELETE(i);
      END IF;
    END LOOP;
    FOR i IN 1 .. 50
    LOOP
      DBMS_OUTPUT.PUT('-');
    END LOOP;
    printParts('Sparsely populated', tempParts);
    END;
    /When I've substituted an INTEGER global variable with such FOR .. LOOP counter, an APEX have returned an error "ORA-01403: no data found".
    DECLARE
    TYPE partsTable IS TABLE OF parts%ROWTYPE;
    tempParts partsTable := partsTable();
    CURSOR selectedParts IS
      SELECT * FROM parts ORDER BY id;
    currentPart selectedParts%ROWTYPE;
    PROCEDURE printParts(p_title IN VARCHAR2, p_collection IN partsTable) IS
      BEGIN
       DBMS_OUTPUT.PUT_LINE(' ');
       DBMS_OUTPUT.PUT_LINE(p_title || ' elements: ' || p_collection.COUNT);
       FOR i IN 1 .. p_collection.COUNT
       LOOP
        DBMS_OUTPUT.PUT('Element is ');
         IF tempParts(i).id IS NULL THEN DBMS_OUTPUT.PUT_LINE('an empty element.');
         ELSE DBMS_OUTPUT.PUT_LINE('ID: ' || tempParts(i).id || ' DESCRIPTION: ' || tempParts(i).description);
         END IF;
       END LOOP;
    END printParts;
    BEGIN
    FOR currentPart IN selectedParts
    LOOP
      tempParts.EXTEND(2);
      tempParts(tempParts.LAST) := currentPart;
    END LOOP;
    printParts('Densely populated', tempParts);
    FOR i IN 1 .. tempParts.COUNT
    LOOP
      IF tempParts(i).id is NULL THEN tempParts.DELETE(i);
      END IF;
    END LOOP;
    FOR i IN 1 .. 50
    LOOP
      DBMS_OUTPUT.PUT('-');
    END LOOP;
    printParts('Sparsely populated', tempParts);
    END;
    /When I've tried to handle this code in SQL*Plus, the following picture have appeared:
    Densely populated elements: 10
    Element is an empty element.
    Element is ID: 1 DESCRIPTION: Fax Machine
    Element is an empty element.
    Element is ID: 2 DESCRIPTION: Copy Machine
    Element is an empty element.
    Element is ID: 3 DESCRIPTION: Laptop PC
    Element is an empty element.
    Element is ID: 4 DESCRIPTION: Desktop PC
    Element is an empty element.
    Element is ID: 5 DESCRIPTION: Scanner
    Sparsely populated elements: 5
    DECLARE
    ERROR at line 1:                                 
    ORA-01403: no data found                         
    ORA-06512: at line 14                            
    ORA-06512: at line 35What's wrong in code(or what I have not understood)? Help please!

    942736 wrote:
    What's wrong in code(or what I have not understood)? Help please!First code. You have collection of 10 elements:
    1 - null
    2 - populated
    3 - null
    4 - populated
    5 - null
    6 - populated
    7 - null
    8 - populated
    9 - null
    10 - populated
    Then you delete null elements and have 5 element collection
    2 - populated
    4 - populated
    6 - populated
    8 - populated
    10 - populated
    Now you execute:
    printParts('Sparsely populated', tempParts);Inside procedure you execute:
    currentElement := p_collection.FIRST;
    This assingns currentElement value 2. Then procedure loops 5 times (collection element count is 5). Element 2 exists. Inside loop procedure executes:
    currentElement := p_collection.NEXT(currentElement);
    which assigns currentElement values 4,6,8,10 - all existing elements.
    Now second code. Everything is OK until you delete null elements. Again we have:
    2 - populated
    4 - populated
    6 - populated
    8 - populated
    10 - populated
    Again you execute:
    printParts('Sparsely populated', tempParts);Now procedure loops 5 times (i values are 1,2,3,4,5):
    FOR i IN 1 .. p_collection.COUNT
    Very first iteration assingns i value 1. And since collection has no element with substript 1 procedure raises no data found.
    SY.

  • Resetting a for loop counter and restarting the computation

    I have a while loop nested inside a for loop to do a calculation of a model. 
    Lets say I am on the for loop counter 4. Suppose I wanted to keep track of the number of iterations on one the while loop, and if it exceeded a certain number say 100, exit the while loop.  I am doing this to avoid my model calculation being stuck at a spot due to optimization issues. I now want to restart the calculations of for loop counter 4. 
    Is there a way to do this in labview? 
    Solved!
    Go to Solution.

    Well first of all, if you are going to restart the loop with the same program inside it after it got stuck is it not just going to get stuck again creating a permanent loop in the code? Would you not just want to move on and have some sort of identifier that one of the for-loops got stuck?
    But I would recommend simply nesting your while-loop inside of another while loop, then connect the exit for the out while-loop to some variable from the inner while-loop, so if the optimization did not occur properly then it simply repeats the inner while-loop.
    Although I stick by my thoughts that you will just end up in a permanent loop if the optimization fails the first time.

  • LabVIEW 6.1 If For Loop count terminal is zero then value going through the loop is not passed on to the output of the loop

    Hello, one of our customers just encountered an execution error in a vi running under LabVIEW 6.1, which doesn't exist under LabVIEW 5.1 or 6.01. I have a simple vi that has two encapsulated For Loops. Two string arrays go in, one goes out of the outer loop. Inside the outer loop the first array is indexed. The string which results from this indexing is compared with all other strings from the second string array in the inner loop. If it matches one of the strings of the second array, it is not outputted, otherwise this string goes through the inner For Loop to the output of the inner loop and from there to the output of the outer loop. The count
    terminal of the outer/inner loop is connected to the Array Size of the first/second string array. If the second array is empty, that means that the element in test from the first arry cannot match anything from the second array, so the element in test is send to the output of the inner loop and from there to the output of the outer loop. This works fine in LabVIEW 5.1 and 6.01, but NOT in LabVIEW 6.1. In LabVIEW 6.1 the inner loop is never executed if the count value is zero (which is correct), but the data line running through the loop is not executed either, which is different to what LabVIEW 5.1 and 6.01 do. There, the input string is sent to the output of the inner loop correctly even if the loop counter is zero. The solution is easy - I just have to connect the output of the outer loop to the data line BEFORE it enters the inner loop. But: I don't know if this is a LabVIEW 6.1 bug or if it is supposed to be a feature, but it brings some incompatibility in programming between the
    different LabVIEW versions.
    Best regards,
    Gabsi

    Hi,
    When a for-loop runs zero times, all outputs are 'undefined' (and should
    be).
    Besides, how would LV know what the output of a not executed routine should
    be?
    It might be handled differently in LV5 and LV6, which is unfortunate. In
    both cases, the result is undefined.
    It's not a bug. It's just something that should be avoided in any LV
    version.
    > The solution is easy - I just have to connect the
    > output of the outer loop to the data line BEFORE it enters the inner
    > loop. But: I don't know if this is a LabVIEW 6.1 bug or if it is
    In some cases this does the trick. But if the data is changed in the inner
    loop, this will effect the results if the N is not zero.
    Technically, I think the output in this construction is also 'undefined'.
    But LV handles this as expected / desired.
    Another solution is to use a shift register. If N is zero, the input is
    directly passed through to the output.
    Regards,
    Wiebe.
    "Gabs" wrote in message
    news:[email protected]...
    > LabVIEW 6.1 If For Loop count terminal is zero then value going
    > through the loop is not passed on to the output of the loop
    >
    > Hello, one of our customers just encountered an execution error in a
    > vi running under LabVIEW 6.1, which doesn't exist under LabVIEW 5.1 or
    > 6.01. I have a simple vi that has two encapsulated For Loops. Two
    > string arrays go in, one goes out of the outer loop. Inside the outer
    > loop the first array is indexed. The string which results from this
    > indexing is compared with all other strings from the second string
    > array in the inner loop. If it matches one of the strings of the
    > second array, it is not outputted, otherwise this string goes through
    > the inner For Loop to the output of the inner loop and from there to
    > the output of the outer loop. The count terminal of the outer/inner
    > loop is connected to the Array Size of the first/second string array.
    > If the second array is empty, that means that the element in test from
    > the first arry cannot match anything from the second array, so the
    > element in test is send to the output of the inner loop and from there
    > to the output of the outer loop. This works fine in LabVIEW 5.1 and
    > 6.01, but NOT in LabVIEW 6.1. In LabVIEW 6.1 the inner loop is never
    > executed if the count value is zero (which is correct), but the data
    > line running through the loop is not executed either, which is
    > different to what LabVIEW 5.1 and 6.01 do. There, the input string is
    > sent to the output of the inner loop correctly even if the loop
    > counter is zero. The solution is easy - I just have to connect the
    > output of the outer loop to the data line BEFORE it enters the inner
    > loop. But: I don't know if this is a LabVIEW 6.1 bug or if it is
    > supposed to be a feature, but it brings some incompatibility in
    > programming between the different LabVIEW versions.
    > Best regards,
    > Gabsi

  • Count (*)  for select stmt take more time than  execute a that sql stmt

    HI
    count (*) for select stmt take more time than execute a that sql stmt
    executing particular select stmt take 2.47 mins but select stmt is using the /*+parallel*/ (sql optimer) in that sql  command for faster execute .
    but if i tried to find out total number of rows in that query it takes more time ..
    almost 2.30 hrs still running to find count(col)
    please help me to get count of row faster.
    thanks in advance...

    797525 wrote:
    HI
    count (*) for select stmt take more time than execute a that sql stmt
    executing particular select stmt take 2.47 mins but select stmt is using the /*+parallel*/ (sql optimer) in that sql  command for faster execute .
    but if i tried to find out total number of rows in that query it takes more time ..
    almost 2.30 hrs still running to find count(col)
    please help me to get count of row faster.
    thanks in advance...That may be because your client is displaying only the first few records when you are running the "SELECT *". But when you run "COUNT(*)", the whole records has to be counted.
    As already mentined please read teh FAQ to post tuning questions.

  • Error in sql query as "loop has run more times than expected (Loop Counter went negative)"

    Hello,
    When I run the query as below
    DECLARE @LoopCount int
    SET @LoopCount = (SELECT Count(*) FROM KC_PaymentTransactionIDConversion with (nolock) Where KC_Transaction_ID is NULL and TransactionYear is NOT NULL)
    WHILE (
        SELECT Count(*)
        FROM KC_PaymentTransactionIDConversion with (nolock)
        Where KC_Transaction_ID is NULL
        and TransactionYear is NOT NULL
    ) > 0
    BEGIN
        IF @LoopCount < 0
            RAISERROR ('Issue with data in KC_PaymentTransactionIDConversion, loop has run more times than expected (Loop Counter went negative).', -- Message text.
                   16, -- Severity.
                   1 -- State.
    SET @LoopCount = @LoopCount - 1
    end
    I am getting error as "loop has run more times than expected (Loop Counter went negative)"
    Could any one help on this issue ASAP.
    Thanks ,
    Vinay

    Hi Vinay,
    According to your code above, the error message make sense. Because once the value returned by “SELECT Count(*)  FROM KC_PaymentTransactionIDConversion with (nolock) Where KC_Transaction_ID is NULL and TransactionYear is NOT NULL” is bigger than 0,
    then decrease @LoopCount. Without changing the table data, the returned value always bigger than 0, always decrease @LoopCount until it's negative and raise the error.
    To fix this issue with the current information, we should make the following modification:
    Change the code
    WHILE (
    SELECT Count(*)
    FROM KC_PaymentTransactionIDConversion with (nolock)
    Where KC_Transaction_ID is NULL
    and TransactionYear is NOT NULL
    ) > 0
    To
    WHILE @LoopCount > 0
    Besides, since the current query is senseless, please modify the query based on your requirement.
    If there are any other questions, please feel free to ask.
    Thanks,
    Katherine Xiong
    Katherine Xiong
    TechNet Community Support

  • Storing data in a new excel sheet for each loop count

    I have a data acquisition code that takes data from the oscilloscope and saves it in an excel file.
    The oscilloscope has to take data at different instants(at each loop count). At each instant, the data gets appended to the same excel sheet. I just wanted to know if there is a way so that each time the data gets stored in a new excel sheet......
    If I run the vi again, the data is stored in a new excel sheet. But in a single run of the vi, all the data is always stored in a single excel sheet. Can anyone please help me with this??
    Thanx. 

    i have used write to measurement file.
    An image of a part of the code is attached.
    thanx... 
    Attachments:
    abc.jpg ‏25 KB

  • Count for every partition

    Hi,
    How can I get the count for every partition. I want:
    partition_name count(*)
    The table is daily partitioned by a date column.
    Ex:
    ALTER TABLE 'tableName' ADD PARTITION 'tableName||today' VALUES LESS THAN (TO_DATE('tommorow','DD-MM-YYYY'))'
    Regards,
    Gicu

    Hallo,
    if you analyze your table regularily and you want to know
    only approximate count of rows you can use :
    select partition_name, num_rows from dba_tab_partitions
    where table_name = 'TBL_TEST'Else , dynamic SQL:
    declare
    v_partition VARCHAR2(30);
    v_count NUMBEr;
    begin
    FOR x IN (select table_owner, partition_name from dba_tab_partitions
            WHERE table_name = 'TBL_TEST')
    LOOP       
        execute immediate 'SELECT '''||x.partition_name||''', count(*) from '||x.table_owner||'.TBL_TEST PARTITION ("'||x.partition_name||'")'
                           INTO v_partition, v_count ;
        dbms_output.put_line('Partition '||v_partition||' count '||v_count);                  
    END LOOP;                      
    end;     Regards
    Dmytro Dekhtyaryuk

  • SQL logic help for pl/sql block

    Hi All,
    I need your suggestions and comments for the below issue:
    I have two tables: table A and table B
    Table A has two columns as id and counts:
    Id Counts
    99 10
    999 13
    9999 7
    Table B has two columns as Id and order:
    Id Order
    99 1
    999 2
    9999 3
    We need to update Order in Table B such that Id having highest count in table A has Order as 1 in table B and it keep on increasing the order for other Ids based on decreasing counts in table A. This will be like a job which will run daily and look for counts in table A and update Order in table B according to it.
    It seems to be simple but i am not getting it. Please help me out of this by writing some PL/SQL block.
    I will really appreciate your all comments and responses.
    Regards
    Dev

    Hi,
    Keen2Learn wrote:
    Hi All,
    I am really greatful to all fo you for all your replies and comments. I change ORDER table to ORDERS. All you replies worked for me but there is some slight change in scenario which i need to discuss with you all.
    E.g: Table A has 10 rows like below:
    Id Counts Type
    99 10 A
    999 13 A
    9999 7 C
    99 4 B
    999 2 C
    88 2 A
    77 1 C
    777 3 B
    777 5 A
    888 2 CIf you'd like help, please post CREATE TABLE and INSERT statements for your sample data (including table b as it is before the UPDATE or MERGE).
    I populate data in Orders column Table B based on id, by grouping sum of counts for that id in table A.
    Id 999 has highest sum(count) as 15, so it has orders as 1 in Table B and do same for descending counts for each Id.
    Table B has 5 rows like below:
    Id Orders
    99 2
    999 1
    88 4
    777 3
    555 5
    Assume Table B as static(no new record comes in it) but only its Orders changes for each Id based on counts for that Id in Table A. As you see, Table B has id 555 which is not in Table A, so we need to update its orders to the highest number by taking its Count as 0(zero). Sorry, it's unclear what you want to do.
    Post what you'd like table b to look like after the UPDATE or MERGE.
    Right now i am doing it like this:
    declare
         cursor c1 is
         select Id, SUM (COUNT), RANK () OVER (ORDER BY SUM (COUNT)) rnk
         from TableA      AND Id IN (SELECT Id FROM TableB)
    GROUP BY Id
    ORDER BY rnk DESC;
    i NUMBER := 1;
    begin
    for curr in c1
    loop
         update TableB      
    set orders = i
         where id = curr.id;
         i := i + 1;
    end loop;
    end;I'm not sure what you're trying to do, but I'll bet you don't need PL/SQL to do it. Use a single UPDATE or MERGE statement (inside PL/SQL if necessary).
    But it is not updating orders for Id 555 in TableB.There is no row for id=555 in table b, and, according to your requirements, there never will be, because "Table B as static(no new record comes in it)". It's behaving exactly as you said you wanted it to. What's the problem?
    Please provide your suggesstions on what needs to be done to take care of this scenario. I will really appreciate your all suggesstions and comments. Please let me know if need some more explanation.Whenever you have a problem, post a little sample data (CREATE TABLE and INSERT statements, relevant columns only), and the results you want from that data.
    In the case of a DML operation (such as UPDATE) the sample data should show what the tables are like before the DML, and the results will be the contents of the changed table(s) after the DML.
    Explain, using specific examples, how you get those results from that data.
    Always say what version of Oracle you're using.

  • SQL loop

    Hi Gurus
    Question :
    Using only SQL not PL/SQL* can we do loop ?
    for example :
    SELECT COUNT (*)
    FROM (SELECT object_name
    FROM all_objects
    WHERE object_type = 'TABLE')
    Now i am aware we have a static table which can give count but idea here is avoid the PL/SQL and not to use static information.
    Objective : to be able to loop using only SQL ...
    with the above mentioned query what i want to achieve is :
    1. be able to take all tables then do count on all tables one by one.
    please help provide comment

    855161 wrote:
    Again question is to challenge the intellectuals persons who can think outside the box and are creative..... thanksWhy don't you think outside the box yourself and use google or the documentation or a correct forum instead of challenge the intellectuals persons with a question that can be easily solved by taking a look at the documentation.
    take a look at the num_rows column of all_tables:
    http://docs.oracle.com/cd/E11882_01/server.112/e25513/statviews_2117.htm#i1592091
    it will be refreshed every time you gather statistics on your tables. How outside the box and creative is that for you?
    cheers

  • What is the problem with native dynamic sql when counting rows in all table

    what is the problem with native dynamic sql when counting rows in all table?Giving an error "table or view does not exist". Thanks.
    DECLARE
    v_sql_string varchar2(1000);
    v_no_of_rows number;
    BEGIN
    for i in ( select table_name from all_tables )
    loop
    v_sql_string := ' select count(1) from ' || i.table_name;
    dbms_output.put_line( v_sql_string );
    --execute immediate v_sql_string into v_no_of_rows;
    end loop;
    END;

    Usually your problem can be described with 'Who cares'. I mean, for what reason do you do this? I doubt that there's a business need to get 100 % accurate answers for this. Normally such things are used to get a picture about the growth of data.
    Personally I would prefer to have up-to-date statistics for all tables and just query the number of rows from there. Sufficient for me in < 99 % of all cases.
    Just my $ .02...

  • There was an error while updating row count for "SH".."SH".CHANNELS

    Hi All,
    Am new to OBIEE.Pls help in this regard.
    Am building the physical layer as per Repository guide.When am importing the data in to this,am getting the below error.
    *"There was an error while updating row count for "SH".."SH".CHANNELS" :"*
    channles is the table name and having 5 rows.
    but am able to see the data in the sql prompt. like SELECT * FROM SH.CHANNELS then 5 rows data would be displaying..
    pls help in this regard and where is the excat problem?
    Thanks,

    what is the error?
    Make sure that your connection pool settings are okay..
    Make sure that, you are using correct driver in case of if you are using ODBC dsn..
    Also make sure that, your oracle server is running... TNS and Oracle server services

  • How do I show a count for rows that don't exist?

    Hi, I'm trying to count the number of records grouped by rank(B,C,R),month,and year. Basically, anytime a part fails testing a record is entered which records the failure Rank and occurrence date. A record is only inserted if a part failed for specific rank. So not all 3 ranks will have entries. I'm able to count all ranks by month,year that do exist. But how do I get values of 0 for the ranks that don't exist? I just created a table qa_rank that has just one column rank with 3 records(b,c,r). but its not being used as of now. rank is just a column in qa_occ record.Here is my query.
    select to_char(occdate,'YY') as yr, to_char(occdate,'MM') as mn,
    rank, count(occdate)
    from qa_occ
    where q.occdate between '1-Apr-2005'and '31-Mar-2006'
    and q.supplier = '11107'
    group by to_char(q.occdate,'YY'),to_char(q.occdate,'MM'),q.rank
    order by to_char(q.occdate,'YY'),to_char(q.occdate,'MM')
    which returns this
    YY MM RANK COUNT(OCCDATE)
    05 09 C 2
    05 10 C 2
    05 11 C 1
    05 11 R 1
    06 01 C 3
    06 02 C 1
    06 03 B 1
    06 03 C 2
    I need it to return C,B,R for everymonth. If no records exist then the count for the month,rank should be 0. Any ideas? Thanks.

    something like:
    SQL> with qa_occ as
      2  (select to_date('09/15/2005','mm/dd/yyyy') occdate, 'B3661-RYPX-A000' part, 'C' rank, 4 indexpoints from dual
      3   union all
      4   select to_date('09/25/2005','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
      5   union all
      6   select to_date('10/11/2005','mm/dd/yyyy') occdate, null part, 'C' rank, 7 indexpoints from dual
      7   union all
      8   select to_date('10/20/2005','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
      9   union all
    10   select to_date('11/11/2005','mm/dd/yyyy') occdate, null part, 'C' rank, 4 indexpoints from dual
    11   union all
    12   select to_date('11/18/2005','mm/dd/yyyy') occdate, 'B3661-RYPX-A000' part, 'R' rank, 0 indexpoints from dual
    13   union all
    14   select to_date('01/11/2006','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
    15   union all
    16   select to_date('01/25/2006','mm/dd/yyyy') occdate, '3511-RNA0-0111' part, 'C' rank, 4 indexpoints from dual
    17   union all
    18   select to_date('01/27/2006','mm/dd/yyyy') occdate, '3511-RNA0-0111' part, 'C' rank, 4 indexpoints from dual
    19   union all
    20   select to_date('02/15/2006','mm/dd/yyyy') occdate, '3511-RNA0-0111' part, 'C' rank, 4 indexpoints from dual
    21   union all
    22   select to_date('03/07/2006','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
    23   union all
    24   select to_date('03/14/2006','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
    25   union all
    26   select to_date('03/15/2006','mm/dd/yyyy') occdate, '3511-RNA0-0111' part, 'B' rank, 13 indexpoints from dual)
    27  select * from qa_occ;
    OCCDATE   PART            R INDEXPOINTS
    15-SEP-05 B3661-RYPX-A000 C           4
    25-SEP-05 B3661-RYP-A000  C           4
    11-OCT-05                 C           7
    20-OCT-05 B3661-RYP-A000  C           4
    11-NOV-05                 C           4
    18-NOV-05 B3661-RYPX-A000 R           0
    11-JAN-06 B3661-RYP-A000  C           4
    25-JAN-06 3511-RNA0-0111  C           4
    27-JAN-06 3511-RNA0-0111  C           4
    15-FEB-06 3511-RNA0-0111  C           4
    07-MAR-06 B3661-RYP-A000  C           4
    14-MAR-06 B3661-RYP-A000  C           4
    15-MAR-06 3511-RNA0-0111  B          13
    13 rows selected.
    assuming that there are only three ranks available B, C,and R we considered this as a lookup values. now in the query below we incorporate an inline view for the lookup values:
    SQL> with qa_occ as
      2  (select to_date('09/15/2005','mm/dd/yyyy') occdate, 'B3661-RYPX-A000' part, 'C' rank, 4 indexpoints from dual
      3   union all
      4   select to_date('09/25/2005','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
      5   union all
      6   select to_date('10/11/2005','mm/dd/yyyy') occdate, null part, 'C' rank, 7 indexpoints from dual
      7   union all
      8   select to_date('10/20/2005','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
      9   union all
    10   select to_date('11/11/2005','mm/dd/yyyy') occdate, null part, 'C' rank, 4 indexpoints from dual
    11   union all
    12   select to_date('11/18/2005','mm/dd/yyyy') occdate, 'B3661-RYPX-A000' part, 'R' rank, 0 indexpoints from dual
    13   union all
    14   select to_date('01/11/2006','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
    15   union all
    16   select to_date('01/25/2006','mm/dd/yyyy') occdate, '3511-RNA0-0111' part, 'C' rank, 4 indexpoints from dual
    17   union all
    18   select to_date('01/27/2006','mm/dd/yyyy') occdate, '3511-RNA0-0111' part, 'C' rank, 4 indexpoints from dual
    19   union all
    20   select to_date('02/15/2006','mm/dd/yyyy') occdate, '3511-RNA0-0111' part, 'C' rank, 4 indexpoints from dual
    21   union all
    22   select to_date('03/07/2006','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
    23   union all
    24   select to_date('03/14/2006','mm/dd/yyyy') occdate, 'B3661-RYP-A000' part, 'C' rank, 4 indexpoints from dual
    25   union all
    26   select to_date('03/15/2006','mm/dd/yyyy') occdate, '3511-RNA0-0111' part, 'B' rank, 13 indexpoints from dual)
    27  select qa.yr, qa.mn,
    28         decode(qa.rank,lk.rank,qa.rank,lk.rank) rank,
    29         sum(decode(qa.rank,lk.rank,qa.cnt,0)) cnt
    30    from (select to_char(qo.occdate,'YY') as yr,
    31                 to_char(qo.occdate,'MM') as mn,
    32                 qo.rank,
    33                 count(qo.occdate) cnt
    34            from qa_occ qo
    35          group by to_char(qo.occdate,'YY'),
    36                   to_char(qo.occdate,'MM'),
    37                   qo.rank) qa,
    38         (select 'B' rank from dual
    39          union all
    40          select 'C' rank from dual
    41          union all
    42          select 'R' rank from dual) lk
    43  group by qa.yr, qa.mn, decode(qa.rank,lk.rank,qa.rank,lk.rank)
    44  order by qa.yr, qa.mn, decode(qa.rank,lk.rank,qa.rank,lk.rank);
    YR MN R        CNT
    05 09 B          0
    05 09 C          2
    05 09 R          0
    05 10 B          0
    05 10 C          2
    05 10 R          0
    05 11 B          0
    05 11 C          1
    05 11 R          1
    06 01 B          0
    06 01 C          3
    06 01 R          0
    06 02 B          0
    06 02 C          1
    06 02 R          0
    06 03 B          1
    06 03 C          2
    06 03 R          0
    18 rows selected.
    SQL>

  • Get the Count for each row

    I'm trying to get the count for each row to total count for each month
    Something like this
    Hardware     |      Jan
    Monitors       |       5
    Processors   |      137
    Printers        |      57
    etc........
    How can I write a query for this. I can get the Hardware column but don't know how to get the next column.

    If you can provide more data like sample input DML statements it would have been wonderful..
    Assuming is , you need a pivot. Here is an article on basic Pivot..
    http://sqlsaga.com/sql-server/how-to-use-pivot-to-transform-rows-into-columns-in-sql-server/
    something like this may be..
    DECLARE @Input TABLE
    Hardware VARCHAR(20),
    [Date] VARCHAR(20)
    INSERT INTO @Input VALUES('Monitor', '01/01/2014'), ('CPU', '01/01/2014'), ('Monitor', '01/03/2014')
    , ('ABC', '01/01/2014'),('Monitor', '02/01/2014')
    ;WITH CTE AS
    SELECT Hardware, LEFT(DATENAME(M, [Date]),3) AS [MonthName] FROM @Input
    SELECT *
    FROM
    SELECT Hardware, [MonthName], COUNT(Hardware) AS Count FROM CTE GROUP BY Hardware, [MonthName]) a
    PIVOT (MAX([Count]) FOR [MonthName] IN ([Jan], [Feb])) pvt
    Please mark as answer, if this has helped you solve the issue.
    Good Luck :) .. visit www.sqlsaga.com for more t-sql code snippets and BI related how to articles.

Maybe you are looking for

  • HT2490 the "X" to close tabs on my macbook is gone how do I get it back to work again

    the "X" to close tabs on my macbook is gone how do I get it back to work again

  • Errors using aCC 3.31--- Unexpected 'std'

    [Compilation Errors using aCC 3.31/HP-UX 11.0 --                        Unexpected 'std'] Hi, I get the following errors when I try to include 'occi.h' in my programs while working with the OCCI classes for Oracle9i database connectivity. Please let

  • Ora-1031 - emca -config dbcontrol db

    Hi, I had an instance that was running fine with a fully functioning EM installation. We needed to move the database onto a different domain which meant that I needed to drop the repository and console and recreate them. The repository recreated with

  • Address book contact

    Hi I do not understand why I am not seeing a contact in my Skype suggested contact when I saved his number then why it is not showing as address book contact

  • Print dialog not remembering settings

    I have a very simple saved setting for my Lexmark E332n printer that sets the paper feed to manual. The problem is that since upgrading to Leopard, the manual paper feed setting is not remembered. In fact I have tried deleting the saved setting, sett