Analytic function to count rows based on Special criteria

Hi
I have the following query with analytic function but wrong results on the last column COUNT.
Please help me to achive the required result.Need to change the way how I select the last column.
1)I am getting the output order by b.sequence_no column . This is a must.
2)COUNT Column :
I don't want the total count based on thor column hence there is no point in grouping by that column.
The actual requirement to achieve COUNT is:
2a -If in the next row, if either the THOR and LOC combination changes to a new value, then COUNT=1
(In other words, if it is different from the following row)
2b-If the values of THOR and LOC repeats in the following row, then the count should be the total of all those same value rows until the rows become different.
(In this case 2b-WHERE THE ROWS ARE SAME- also I only want to show these same rows only once. This is shown in the "MY REQUIRED OUTPUT) .
My present query:
select    r.name REGION ,
          p.name PT,
          do.name DELOFF,
          ro.name ROUTE,
decode(th.thorfare_name,'OSIUNKNOWN',NULL,th.thorfare_name)
           THOR,
         l.name LOC ,
          b.sequence_no SEQ,
           CASE WHEN th.thorfare_name = LAG (th.thorfare_name)
            OVER (order by b.sequence_no)
            or th.thorfare_name = LEAD (th.thorfare_name)
            OVER (order by b.sequence_no)
            THEN  COUNT(b.sequence_no) OVER (partition by r.name,th.thorfare_name,l.name order BY b.sequence_no
          ELSE 1
          END COUNT
from   t_regions r,t_post_towns p,t_delivery_offices do, t_routes ro, t_counties c,t_head_offices ho,
t_buildings b,t_thoroughfares th,t_localities l
where   th.thorfare_id = b.thorfare_id
and    nvl(b.invalid,'N')='N'
and    b.route_id=ro.route_id(+)
and    b.locality_id =l.locality_id(+)
and    ro.delivery_office_id=do.delivery_office_id(+)
and    do.post_town_id = p.post_town_id(+)
and    p.ho_id=ho.ho_id(+)
and     ho.county_id = c.county_id(+)
and     c.region_id = r.region_id(+)
and    r.name='NAAS'
and    do.DELIVERY_OFFICE_id= &&DELIVERY_OFFICE_id
and    ro.route_id=3405
group by r.name,p.name,do.name,ro.name,th.thorfare_name,l.name,b.sequence_no
ORDER BY ro.name,b.sequence_no;My incorrect output[PART OF DATA]:
>
REGION     PT DELOFF ROUTE     THOR LOC SEQ COUNT
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 1 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 2 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 PRIMHILL CEL 4 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 5 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 THEGROVE CEL 2 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 7 3
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 8 4
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 9 5
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 10 6
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 11 7
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 12 8
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 15 2
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 19 3
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 24 4
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 29 5
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 34 6
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 39 7
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 42 2
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 PRIMHILL CEL 43 2
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 PRIMHILL CEL 44 3
My required output[PART OF DATA]-Please compare with the above.:
>
REGION     PT DELOFF ROUTE     THOR LOC COUNT
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 PRIMHILL CEL 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 THEGROVE CEL 1
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 NEWTOWNRD CEL 6
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 DUBLINRD CEL 7
NAAS     NAAS MAYNOOTH     MAYNOOTHR010 PRIMHILL CEL 2
NOTE :Count as 1 is correctly coming.
But where there is same rows and I want to take the total count on them, I am not getting.
Pls pls help.
Thanks
Edited by: Krithi on 04-Nov-2010 05:28

Nicosa wrote:
Hi,
Can you give us some sample data (create table + inserts orders) to play with ?
Considering your output, I'm not even sure you need analytic count.Yes sure.
I am describing the query again here with 3 tables now to make this understand better.
Given below are the create table statements and insert statements for these 3 tables.
These tables are - BULDINGSV,THORV and LOCV
CREATE TABLE BUILDINGSV
  BUILDING_ID                  NUMBER(10)       NOT NULL,
  INVALID                      VARCHAR2(1 BYTE),
  ROUTE_ID                     NUMBER(10),
  LOCALITY_ID                  NUMBER(10),
  SEQUENCE_NO                  NUMBER(4),
  THORFARE_ID                  NUMBER(10) NOT NULL
CREATE TABLE THORV
  THORFARE_ID            NUMBER(10)             NOT NULL,
  THORFARE_NAME          VARCHAR2(40 BYTE)      NOT NULL
CREATE TABLE LOCV
  LOCALITY_ID            NUMBER(10)             NOT NULL,
  NAME                   VARCHAR2(40 BYTE)      NOT NULL);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002372, 'N', 3405, 37382613, 5, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002363, 'N', 3405, 37382613, 57, 9002364);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002362, 'N', 3405, 37382613, 56, 9002364);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002360, 'N', 3405, 37382613, 52, 9002364);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002358, 'N', 3405, 37382613, 1, 9002364);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002240, 'N', 3405, 37382613, 6, 9002284);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002229, 'N', 3405, 37382613, 66, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002228, 'N', 3405, 37382613, 65, 35291872);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002226, 'N', 3405, 37382613, 62, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002222, 'N', 3405, 37382613, 43, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002217, 'N', 3405, 37382613, 125, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002221, 'N', 3405, 37382613, 58, 9002364);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002214, 'N', 3405, 37382613, 128, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33363182, 'N', 3405, 37382613, 114, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33363185, 'N', 3405, 37382613, 115, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002371, 'N', 3405, 37382613, 2, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27003329, 'N', 3405, 37382613, 415, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002359, 'N', 3405, 37382613, 15, 9002364);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002224, 'N', 3405, 37382613, 61, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27003318, 'N', 3405, 37382613, 411, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27003326, 'N', 3405, 37382613, 412, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27003327, 'N', 3405, 37382613, 413, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27003328, 'N', 3405, 37382613, 414, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27003330, 'N', 3405, 37382613, 416, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27003331, 'N', 3405, 37382613, 417, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27003332, 'N', 3405, 37382613, 410, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27004795, 'N', 3405, 37382613, 514, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (27004807, 'N', 3405, 37382613, 515, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (59002227, 'N', 3405, 37382613, 64, 35291872);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33230805, 'N', 3405, 37382613, 44, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33231027, 'N', 3405, 37382613, 7, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33231058, 'N', 3405, 37382613, 9, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33231078, 'N', 3405, 37382613, 10, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33231087, 'N', 3405, 37382613, 11, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33231093, 'N', 3405, 37382613, 12, 9002375);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (33229890, 'N', 3405, 37382613, 55, 9002364);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561996, 'N', 3405, 34224751, 544, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561997, 'N', 3405, 34224751, 543, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561998, 'N', 3405, 34224751, 555, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562000, 'N', 3405, 34224751, 541, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562001, 'N', 3405, 34224751, 538, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562028, 'N', 3405, 35417256, 525, 0);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562031, 'N', 3405, 35417256, 518, 35417271);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562032, 'N', 3405, 35417256, 519, 35417271);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562033, 'N', 3405, 35417256, 523, 35417271);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561939, 'N', 3405, 34224751, 551, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561940, 'N', 3405, 34224751, 552, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561941, 'N', 3405, 34224751, 553, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561942, 'N', 3405, 35417256, 536, 0);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561943, 'N', 3405, 35417256, 537, 0);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561970, 'N', 3405, 35417256, 522, 35417271);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561972, 'N', 3405, 35417256, 527, 35417271);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561974, 'N', 3405, 35417256, 530, 35417271);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561975, 'N', 3405, 35417256, 531, 35417271);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561980, 'N', 3405, 34224751, 575, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561981, 'N', 3405, 34224751, 574, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561983, 'N', 3405, 34224751, 571, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561984, 'N', 3405, 34224751, 570, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561985, 'N', 3405, 34224751, 568, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561986, 'N', 3405, 34224751, 567, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561987, 'N', 3405, 34224751, 566, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561989, 'N', 3405, 34224751, 563, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561990, 'N', 3405, 34224751, 562, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561991, 'N', 3405, 34224751, 560, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561992, 'N', 3405, 34224751, 559, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561993, 'N', 3405, 34224751, 558, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561994, 'N', 3405, 34224751, 548, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80561995, 'N', 3405, 34224751, 546, 35417360);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562160, 'N', 3405, 37382613, 139, 35291878);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562161, 'N', 3405, 37382613, 140, 35291878);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562162, 'N', 3405, 37382613, 141, 35291878);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562163, 'N', 3405, 37382613, 142, 35291878);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562164, 'N', 3405, 37382613, 143, 35291878);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562165, 'N', 3405, 37382613, 145, 35291878);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562166, 'N', 3405, 37382613, 100, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562167, 'N', 3405, 37382613, 102, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562171, 'N', 3405, 37382613, 107, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562172, 'N', 3405, 37382613, 108, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562174, 'N', 3405, 37382613, 110, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562175, 'N', 3405, 37382613, 111, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562176, 'N', 3405, 37382613, 112, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562177, 'N', 3405, 37382613, 113, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562182, 'N', 3405, 37382613, 123, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562183, 'N', 3405, 37382613, 121, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562184, 'N', 3405, 37382613, 120, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562185, 'N', 3405, 37382613, 118, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562186, 'N', 3405, 37382613, 117, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562187, 'N', 3405, 37382613, 116, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562189, 'N', 3405, 37382613, 95, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562190, 'N', 3405, 37382613, 94, 35291883);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562213, 'N', 3405, 37382613, 89, 35291872);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (80562240, 'N', 3405, 35417256, 516, 35417271);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (35329559, 'N', 3405, 35329152, 443, 35329551);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (35329560, 'N', 3405, 35329152, 444, 35329551);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (35329562, 'N', 3405, 35329152, 446, 35329551);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (35329109, 'N', 3405, 35329152, 433, 35329181);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (35329169, 'N', 3405, 35329152, 434, 35329181);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (35329557, 'N', 3405, 35329152, 441, 35329551);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (35329558, 'N', 3405, 35329152, 442, 35329551);
Insert into BUILDINGSV
   (BUILDING_ID, INVALID, ROUTE_ID, LOCALITY_ID, SEQUENCE_NO, THORFARE_ID)
Values
   (35329191, 'N', 3405, 35329152, 436, 35329181);
COMMIT;
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (0, 'OSIUNKNOWN');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (9002284, 'THE GROVE');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (9002364, 'DUBLIN ROAD');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (9002375, 'NEWTOWN ROAD');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35291872, 'HAZELHATCH ROAD');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35291878, 'SIMMONSTOWN PARK');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35291883, 'PRIMROSE HILL');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35329181, 'THE COPSE');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35329213, 'THE COURT');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35329529, 'THE CRESCENT');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35329551, 'THE LAWNS');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35329580, 'THE DRIVE');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35417271, 'TEMPLEMILLS COTTAGES');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (35417360, 'CHELMSFORD');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (36500023, 'THE CLOSE');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (36500101, 'THE GREEN');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (37375569, 'THE DOWNS');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (37375595, 'THE PARK');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (37375754, 'THE AVENUE');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (37375781, 'THE VIEW');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (37376046, 'THE CRESCENT');
Insert into THORV
   (THORFARE_ID, THORFARE_NAME)
Values
   (37376048, 'THE GLADE');
COMMIT;
Insert into LOCV
   (LOCALITY_ID, NAME)
Values
   (34224751, 'SIMMONSTOWN');
Insert into LOCV
   (LOCALITY_ID, NAME)
Values
   (35417256, 'TEMPLEMILLS');
Insert into LOCV
   (LOCALITY_ID, NAME)
Values
   (35329152, 'TEMPLE MANOR');
Insert into LOCV
   (LOCALITY_ID, NAME)
Values
   (37382613, 'CELBRIDGE');
Insert into LOCV
   (LOCALITY_ID, NAME)
Values
   (37375570, 'SAINT WOLSTAN''S ABBEY');
COMMIT;
------------------------------------------------------------------------------Now the query with wrong result:
select decode(th.thorfare_name,'OSIUNKNOWN',NULL,th.thorfare_name)
           THOR,
            l.name LOC,
            b.sequence_no SEQ,
           CASE WHEN th.thorfare_name = LAG (th.thorfare_name)
            OVER (order by b.sequence_no)
            or th.thorfare_name = LEAD (th.thorfare_name)
            OVER (order by b.sequence_no)
            THEN  COUNT(b.sequence_no) OVER (partition by th.thorfare_name,l.name order BY b.sequence_no
          ELSE 1
          END COUNT   from BUILDINGSV b,THORV th,LOCV l                 
where   th.thorfare_id = b.thorfare_id
and    nvl(b.invalid,'N')='N'
and    b.route_id=3405
and    b.locality_id =l.locality_id(+)
order by b.sequence_no;The query result -WRONG (only first few lines)
THOR                        LOC        SEQ    COUNT
DUBLIN ROAD     CELBRIDGE    1     1
NEWTOWN ROAD     CELBRIDGE        2     1
NEWTOWN ROAD     CELBRIDGE        5     2
THE GROVE     CELBRIDGE        6     1
NEWTOWN ROAD     CELBRIDGE        7     3
NEWTOWN ROAD     CELBRIDGE        9     4
NEWTOWN ROAD     CELBRIDGE       10     5
NEWTOWN ROAD     CELBRIDGE       11     6
NEWTOWN ROAD     CELBRIDGE       12     7
DUBLIN ROAD     CELBRIDGE       15     1
PRIMROSE HILL     CELBRIDGE       43     1
PRIMROSE HILL     CELBRIDGE       44     2
DUBLIN ROAD     CELBRIDGE       52     3
DUBLIN ROAD     CELBRIDGE       55     4
DUBLIN ROAD     CELBRIDGE       56     5
DUBLIN ROAD     CELBRIDGE       57     6
DUBLIN ROAD     CELBRIDGE       58     7
PRIMROSE HILL     CELBRIDGE       61     3
PRIMROSE HILL     CELBRIDGE       62     4
HAZELHATCH ROAD     CELBRIDGE       64     1
HAZELHATCH ROAD     CELBRIDGE       65     2The query result -EXPECTED (only first few lines)
THOR                     LOC     COUNT
DUBLIN ROAD     CELBRIDGE      1
NEWTOWN ROAD     CELBRIDGE      2
THE GROVE     CELBRIDGE      1
NEWTOWN ROAD     CELBRIDGE      5
DUBLIN ROAD     CELBRIDGE      1
PRIMROSE HILL     CELBRIDGE      2
DUBLIN ROAD     CELBRIDGE      5
PRIMROSE HILL     CELBRIDGE      2
HAZELHATCH ROAD     CELBRIDGE      2Please note, in the expected result, I only need 1 row but need to show the total count of rows until the names change.
So the issues are
1) the count column values are wrong in my query.
2)I dont want to repeat the same rows(Please see EXPECTED output and compare it against the original)
3)Want the output in exactly same way as in EXPECTED OUTPUT as I dont want to group by thor name(Eg. I dont want the count for all DUBLIN ROAD but I want to examine rows for the next one, if THOR/LOC combination is different in next row then COUNT=1 else COUNT=Count of no. of rows for that thor/loc combination until the combination change -So there are same value multiple rows which i need to show it in 1 row with the total count)
I am explaining below this in more detail!!
I only need 1 row per same THOR/LOC names coming multiple times but I need the count shown against that 1 row(i.e COUNT= how many rows with same thor/loc combination until THOR/LOC combo changes value).
Then repeat the process until all rows are finished..
If there is no multiple row with same THOR/LOC coming in the following row-i.e the following row is a different THOR/LOC combination, then the count for that row is 1.
Hope this is clear.
Is this doable?
Thanks in advance.
Edited by: Krithi on 04-Nov-2010 07:45
Edited by: Krithi on 04-Nov-2010 07:45
Edited by: Krithi on 04-Nov-2010 08:31

Similar Messages

  • Analytical function need to work based on previous rows result.

    My data are sorted based on sartdatetime column.but i need the sum(value) based on below condition.
    Condition :
    i need to check with current row with previous rows
    if they are same then i need to sum the value with previous row.
    else i need to start the summation.
    My data like below:
    Rownum     Code     Sartdatetime     Value
    1     4619     12/9/2012 11:00      219
    2     5344     12/9/2012 14:39      27
    3     4619     12/9/2012 15:11     20
    4     4619     12/9/2012 19:33     14
    5     4619     12/9/2012 20:53      16
    6     6851     12/9/2012 21:21      1
    7     4619     12/9/2012 21:22     35
    8     5623     12/10/2012 1:59     4
    9     5623     12/10/2012 2:03 3
    10     5623     12/10/2012 2:06 5
    11     4619     12/10/2012 2:17 1
    12     5623     12/10/2012 2:18     5
    13     5623     12/10/2012 2:25      2
    14     5623     12/10/2012 2:27 2
    15     4619     12/10/2012 2:29      30
    Eg:
    Take the first row. For that no previous rows. So we directly added the value like below.
    Rownum     Code     Sartdatetime     Value sum(val)
    1     4619     12/9/2012 11:00      219 219
    take the seconds row, we can check the code value (5344)with first row value (4619). the values are different . So our summation like.
    2     5344     12/9/2012 14:39      27 27
    for third row , we can check the code value (4619)with second row value (5344). the values are different . So our summation like.
    3     4619     12/9/2012 15:11     20 20
    for fourth row we can check the code value (4619)with second row value (4619). the values are same. So our summation like.
    4     4619     12/9/2012 19:33     14 34 - The sum of previous row result.
    5 th row also same value so
    5     4619     12/9/2012 20:53      16 50T he sum of previous row result.
    then the same value come again in 7 th row so here we need to start the summation like below.
    7     4619     12/9/2012 21:22     35 35.
    i want the result like below.
    Rownum     Code     Sartdate time     Value Expected result
    1     4619     12/9/2012 11:00      219 219
    2     5344     12/9/2012 14:39      27 27
    3     4619     12/9/2012 15:11     20 20
    4     4619     12/9/2012 19:33     14 34
    5     4619     12/9/2012 20:53      16 50
    6     6851     12/9/2012 21:21      1 1
    7     4619     12/9/2012 21:22     35 35
    8     5623     12/10/2012 1:59     4 4
    9     5623     12/10/2012 2:03 3 7
    10     5623     12/10/2012 2:06 5 12
    11     4619     12/10/2012 2:17 1 1
    12     5623     12/10/2012 2:18     5 5
    13     5623     12/10/2012 2:25      2 7
    14     5623     12/10/2012 2:27 2 9
    15     4619     12/10/2012 2:29      30 30
    Please help

    Hi,
    Welcome to the forum!
    Here's one way to do what you want:
    WITH     got_grp_id     AS
         SELECT  code, starttime, value
         ,     ROW_NUMBER () OVER ( ORDER BY      starttime )     AS r_num
         ,     ROW_NUMBER () OVER ( ORDER BY      starttime )
               - ROW_NUMBER () OVER ( PARTITION BY  code
                                         ORDER BY          starttime
                           )                    AS grp_id
         FROM    table_x
    SELECT       r_num
    ,       code
    ,       starttime
    ,       value
    ,       SUM (value) OVER ( PARTITION BY  code, grp_id
                                    ORDER BY          starttime
                      )         AS sum_value
    FROM      got_grp_id
    ORDER BY  starttime
    ;For an explanation of the Fixed Difference technique, see {message:id=9953384} and/or {message:id=9957164}
    Whenever you have a problem, please post CREATE TABLE and INSERT statements for your same data. For example:
    CREATE TABLE     table_x
    (   code     NUMBER (4)
    ,   starttime     DATE          UNIQUE
    ,   value     NUMBER
    INSERT INTO table_x (code, starttime, value)
           VALUES         (4619, TO_DATE ( '12/9/2012 11:00', 'MM/DD/YYYY HH24:MI'),
                                            219);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (5344, TO_DATE ( '12/9/2012 14:39', 'MM/DD/YYYY HH24:MI'),
                                            27);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (4619, TO_DATE ( '12/9/2012 15:11', 'MM/DD/YYYY HH24:MI'),
                                            20);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (4619, TO_DATE ( '12/9/2012 19:33', 'MM/DD/YYYY HH24:MI'),
                                            14);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (4619, TO_DATE ( '12/9/2012 20:53', 'MM/DD/YYYY HH24:MI'),
                                            16);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (6851, TO_DATE ( '12/9/2012 21:21', 'MM/DD/YYYY HH24:MI'),
                                            1);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (4619, TO_DATE ( '12/9/2012 21:22', 'MM/DD/YYYY HH24:MI'),
                                            35);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (5623, TO_DATE ( '12/10/2012 1:59', 'MM/DD/YYYY HH24:MI'),
                                            4);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (5623, TO_DATE  ('12/10/2012 2:03' , 'MM/DD/YYYY HH24:MI' ),
                                                       3);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (5623, TO_DATE ( '12/10/2012 2:06', 'MM/DD/YYYY HH24:MI'),
                                            5);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (4619, TO_DATE ( '12/10/2012 2:17', 'MM/DD/YYYY HH24:MI'),
                                            1);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (5623, TO_DATE ( '12/10/2012 2:18', 'MM/DD/YYYY HH24:MI'),
                                            5);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (5623, TO_DATE ( '12/10/2012 2:25', 'MM/DD/YYYY HH24:MI'),
                                            2);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (5623, TO_DATE  ('12/10/2012 2:27' , 'MM/DD/YYYY HH24:MI' ),
                                                       2);
    INSERT INTO table_x (code, starttime, value)
           VALUES         (4619, TO_DATE ( '12/10/2012 2:29', 'MM/DD/YYYY HH24:MI'),
                                            30);
    COMMIT; See the forum FAQ {message:id=9360002}
    Output:
    R_NUM       CODE STARTTIME             VALUE  SUM_VALUE
        1       4619 12/9/2012 11:00         219        219
        2       5344 12/9/2012 14:39          27         27
        3       4619 12/9/2012 15:11          20         20
        4       4619 12/9/2012 19:33          14         34
        5       4619 12/9/2012 20:53          16         50
        6       6851 12/9/2012 21:21           1          1
        7       4619 12/9/2012 21:22          35         35
        8       5623 12/10/2012 01:59          4          4
        9       5623 12/10/2012 02:03          3          7
       10       5623 12/10/2012 02:06          5         12
       11       4619 12/10/2012 02:17          1          1
       12       5623 12/10/2012 02:18          5          5
       13       5623 12/10/2012 02:25          2          7
       14       5623 12/10/2012 02:27          2          9
       15       4619 12/10/2012 02:29         30         30Edited by: Frank Kulash on Dec 24, 2012 6:44 AM
    Added sample data.

  • Counting rows based on consecutive dates

    I need some guidance. I have a database of drug fills from our data warehouse. There is a unique row for every drug filled. I a general rule, there is a 30 day prescription filled each month, and my research question needs me to look at consecutive months filled.
    So, if I have
    Name, Drug_Name, Fill_Date
    John Doe, DrugX, 05-2010
    John Doe, DrugX, 06-2010
    John Doe, DrugX, 07-2010
    John Doe, DrugX, 08-2010
    Mary Jane, DrugX, 05-2010
    Larry Smith, DrugX, 06-2010
    Larry Smith, DrugX, 07-2010
    John Doe, DrugX, 12-2010
    Larry Smith, DrugX, 09-2010
    Larry Smith, DrugX, 12-2010
    I need to identify patients with at least 3 consecutive months of a drug – so in the case above, that would only be John Doe. I can just do a unique count per patient and look at >= 3, because then I would also pick up Larry Smith who has 4 months of prescriptions, but not 3 consecutive months.
    Suggestions?
    Thank for the help.
    Rich
    Edited by: Ricco on Oct 19, 2010 11:19 AM

    Hi,
    Whenever you have a question, please post the sample data in a form that people can use to re-create the problem and test their ideas.
    For example:
    CREATE TABLE     table_x
    (      name          VARCHAR2 (20)
    ,      drug_name     VARCHAR2 (10)
    ,      fill_date     DATE
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('John Doe',    'DrugX', TO_DATE ('05-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('John Doe',    'DrugX', TO_DATE ('06-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('John Doe',    'DrugX', TO_DATE ('07-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('John Doe',    'DrugX', TO_DATE ('08-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('Mary Jane',   'DrugX', TO_DATE ('05-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('Larry Smith', 'DrugX', TO_DATE ('06-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('Larry Smith', 'DrugX', TO_DATE ('07-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('John Doe',    'DrugX', TO_DATE ('12-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('Larry Smith', 'DrugX', TO_DATE ('09-2010', 'MM-YYYY'));
    INSERT INTO table_x (name, drug_name, fill_date) VALUES ('Larry Smith', 'DrugX', TO_DATE ('12-2010', 'MM-YYYY'));
    COMMIT;Also, post the exact output you want. In this case, it's probably very simple. It's unclear from your description, but I think you want this:
    NAME                 DRUG_NAME                                                 
    John Doe             DrugX                                                      Here's one way to get those results from that data:
    WITH  got_month_num      AS
         SELECT DISTINCT  name
         ,           drug_name
         ,           MONTHS_BETWEEN ( TRUNC (SYSDATE,   'MONTH')
                              , TRUNC (fill_date, 'MONTH')
                             ) AS month_num
         FROM          table_x
    --     WHERE          ...     -- Any filtering goes here
    ,     got_group_num     AS
         SELECT     name
         ,     drug_name
         ,     ROW_NUMBER () OVER ( PARTITION BY  name
                                   ,                    drug_name
                             ORDER BY        month_num
                           ) - month_num     AS group_num
         FROM    got_month_num
    SELECT DISTINCT  name,     drug_name      
    FROM             got_group_num
    GROUP BY        name,     drug_name,  group_num
    HAVING           COUNT (*)       >= 3
    ORDER BY      name,     drug_name
    ;I'm guessing at some things.
    For example, you didn't say what role (if any) drug_name plays in this problem, and it's hard to guess since every row has the same drug_name.
    I'm guessing that every distinct combination of name and drug_name is a world of its own, having nothing to do with rows that have the same name but different drug_names, or the same drug_name but different names.
    This assumes that name uniquely identifies each patient.
    This does not assume that there is only one row per name and drug_name in each month, or that all fill_dates are at the same point in the month.
    The query above does require the fill_dates to be in consecutive calendar months. If one fill_date is January 31, 2010, and the next fill_date for the same patient and drug is March 1, 2010, then the rows are not considered to be consecutive, even though there are only 29 days between fill_dates.
    Depending on your data and your requirtements, the first sub-query (got_month_num) may not be necessary.
    A "group" (as defined by group_num) is a set of rows for the same patient and drug in consecutive months. If we number the months with consecutive integers in oreer by date, and number the rows with consecutive integers also in order by date, then the difference between those integers will be constant for all ros in the same group.
    Edited by: Frank Kulash on Oct 19, 2010 2:48 PM

  • Counting rows based on a column value

    Tricky Query.No offence if this is a repeat please.
    This is a PROD issue in SYBASE.
    TableA has id_flag_listing column
    TableA
    id_flag_listing
    N
    N
    N
    N
    N
    1) If all rows are set to 'N',then my count should be 0.
       PrimaryListing
       0
    2) If there is one row which is 'Y' then this shoud be:
       id_flag_listing
       N
       N
       Y
       N
       N
       PrimaryListing
       1
    How can I count in this manner?
    Do i use decode? I am using
    Select sum(decode(flg_active),'Y',1,0))
    from TABLEA
    Will the above work.??
    I am using SQL for Sybase.
    Please guide?

    Did you even tried the SQL query I've given?
    Your table A
    SQL> SELECT flg_listing
      2  FROM
      3  (
      4     SELECT 'N' flg_listing FROM DUAL
      5     UNION ALL
      6     SELECT 'N' FROM DUAL
      7     UNION ALL
      8     SELECT 'N' FROM DUAL
      9     UNION ALL
    10     SELECT 'N' FROM DUAL
    11     UNION ALL
    12     SELECT 'N' FROM DUAL
    13  ) TABLEA;
    FLG_LISTING
    N
    N
    N
    N
    N
    Your table A, from which I count where are of 'Y' value. In these queries, I change TableA contents.
    SQL> SELECT count(*)
      2  FROM
      3  (
      4     SELECT 'N' flg_listing FROM DUAL
      5     UNION ALL
      6     SELECT 'N' FROM DUAL
      7     UNION ALL
      8     SELECT 'N' FROM DUAL
      9     UNION ALL
    10     SELECT 'N' FROM DUAL
    11     UNION ALL
    12     SELECT 'N' FROM DUAL
    13  ) TABLEA
    14  WHERE flg_listing = 'Y';
      COUNT(*)
             0
    SQL> SELECT count(*)
      2  FROM
      3  (
      4     SELECT 'N' flg_listing FROM DUAL
      5     UNION ALL
      6     SELECT 'N' FROM DUAL
      7     UNION ALL
      8     SELECT 'Y' FROM DUAL
      9     UNION ALL
    10     SELECT 'N' FROM DUAL
    11     UNION ALL
    12     SELECT 'N' FROM DUAL
    13  ) TABLEA
    14  WHERE flg_listing = 'Y';
      COUNT(*)
             1
    SQL> SELECT count(*)
      2  FROM
      3  (
      4     SELECT 'N' flg_listing FROM DUAL
      5     UNION ALL
      6     SELECT 'N' FROM DUAL
      7     UNION ALL
      8     SELECT 'Y' FROM DUAL
      9     UNION ALL
    10     SELECT 'Y' FROM DUAL
    11     UNION ALL
    12     SELECT 'Y' FROM DUAL
    13  ) TABLEA
    14  WHERE flg_listing = 'Y';
      COUNT(*)
             3Yoann.

  • Count Rows based on an optionaet value in CRM Online Fetchxml Report

    Hi,
        I am new to FetchXml Reports, I have a Report in which i want to Sum the records which have different Optionset values
    Like Profit,NonProfit,Other.
    I want to calculate the number of rows which have options (Profit,NonProfit,NotApplicable) and show in other column.
    Thanks

    in a last row insert an expression:
    =sum(iif(Fields!IsOrganization.Value = "Profit",1,0) + iif(Fields!IsOrganization.Value = "NonProfit",1,0) + iif(Fields!IsOrganization.Value = "NotApplicable",1,0))
    It will count all rows with "Profit", "NonProfit" and "NotApplicable" text in IsOrganization field.

  • Counting rows that match 2 criteria?

    I've been hunting for this since yesterday and I know it's gotta be something silly I'm just overlooking, but I'm very new to iWork and spreadsheets in general... any help would be greatly appreciated.
    Basically I've a simple table that tracks two items on each row: a trouble code and a time.
    What I need is a formula that will count all rows in which trouble code 5 occurred at 8pm. It seems like it would be easy... a COUNTIF with an AND statement? But I just can't get the syntax right, or maybe I'm just not picking the right function.
    Thanks!
    Jimmy

    sw33tjimmy wrote:
    Thank you. I had read about the COUNTIFS function, but for some reason I didn't see it in the list of options among all of the other stuff I was trying. It's confusing when formulas aren't standardized across the different spreadsheet platforms.
    Happily, they aren't standardized.
    The Ford T era is gone and I hope that it will never return.
    Yvan KOENIG (VALLAURIS, France) mardi 29 juin 2010 21:04:28

  • Counting columns based on set criteria?

    Hello gurus,
    I've been trying for the past hour to count the number of columns that have a certain condition met, that is two check boxes are ticked.
    For example:
    I want to count the number of columns where both Apples & Oranges is TRUE.
    I've tried combinations of SUMIF, COUNTIF, IF, & COLUMNS and really don't have a clue. Searching the web for Excel examples doesn't help and I can't find anything like this on this forum.
    Any help would be much appreciated.
    Regards,
    Dr Paul Martin

    The closest I've been is this:
    =COUNT(AND(Table :: Apples,Table :: Oranges))
    The AND function only generates one result (TRUE/FALSE) which I convert to a number (1/0) with the COUNT function.
    The problem is that I can't count a range of columns that meet this criteria.... it will only give me one result not the total number of positive results.
    What I need is something like this:
    =COLUMNS(AND(Table :: Apples,Table :: Oranges))
    Except that generates an error "COLUMNS requires a range but found a boolean instead". I guess I can't mix them up?
    Regards,
    Dr Paul Martin
    Message was edited by: nitramluap

  • Displaying JTable (AbstractTableModel) rows based on radiobox criteria

    hi,
    Would appreciate some pointers as to how to do this ...
    I have a AbstractTableModel that needs to display rows depending on which radiobox criteria is selected.
    There are only 2 columns in the JTABLE:
    (1) categories (string)
    (2) register interest (boolean)
    The radioboxes (and the criterias) are:
    1. display all rows
    2. display only rows when register interest = false
    3. dislplay only rows when register interest = true
    How can i achieve this ?
    The GetValue/SetValue from AbstractTableModel() deal at the column and not row level. So i am stumped.
    Thanks for any help.
    Tony

    Since you have a custom table model, just create one collection that represents the permanent (all) data, and one collection that represents the filtered data. When the radio selection changes, update the filtered data collection by filtering the permanent data collection.

  • To fetch the rows based on selection criteria.

    Hi,
    1. For the same Ledger Number, if substr(UNIVCODE,1,1) contains both 'O' and 'D', then only the 'O' record need to be fetched.
    2. if substr(UNIVCODE,1,1) contains only 'O', then only the 'O' record need to be fetched.
    3. if substr(UNIVCODE,1,1) contains only 'D', then only the 'D' record need to be fetched.
    INPUT:
    LEDGERNO UNIVCODE     STATE
    000000003338     O 82P 000000003338      PA      
    000000003338     D P 000000003338      CA
    000000003338     O 11P 000000003338      CT
    000000212550     D P P00000212550      MI
    000000003345     O 12P 000000003345      UT
    Output:
    LEDGERNO UNIVCODE     STATE
    000000003338     O 82P 000000003338      PA      
    000000003338     O 11P 000000003338      CT
    000000212550     D P P00000212550      MI
    000000003345     O 12P 000000003345      UT
    Thanks for your time and Appreciate your help in this regard....
    Regards,
    Venkatesh

    with My_Tab as(
    select '000000003338' LEDGERNO, 'O' UNIVCODE, '82P 000000003338 PA' STATE from dual
    UNION ALL
    select '000000003338' LEDGERNO, 'D' UNIVCODE, 'P 000000003338 CA' STATE from dual
    UNION ALL
    select '000000003338' LEDGERNO, 'O' UNIVCODE, '11P 000000003338 CT' STATE from dual
    UNION ALL
    select '000000212550' LEDGERNO, 'D' UNIVCODE, 'P P00000212550 MI' STATE from dual
    UNION ALL
    select '000000003345' LEDGERNO, 'O' UNIVCODE, '12P 000000003345 UT' STATE from dual
    select *
    from My_Tab T1
    where (UNIVCODE = 'O'
           OR
            ( UNIVCODE = 'D'
              AND NOT EXISTS ( SELECT NULL FROM My_tab T2
                                Where T2.LEDGERNO = T1.LEDGERNO
                                    And   T2.UNIVCODE = 'O'
           )

  • COUNT(DISTINCT) WITH ORDER BY in an analytic function

    -- I create a table with three fields: Name, Amount, and a Trans_Date.
    CREATE TABLE TEST
    NAME VARCHAR2(19) NULL,
    AMOUNT VARCHAR2(8) NULL,
    TRANS_DATE DATE NULL
    -- I insert a few rows into my table:
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Anna', '110', TO_DATE('06/01/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Anna', '20', TO_DATE('06/01/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Anna', '110', TO_DATE('06/02/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Anna', '21', TO_DATE('06/03/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Anna', '68', TO_DATE('06/04/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Anna', '110', TO_DATE('06/05/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Anna', '20', TO_DATE('06/06/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Bill', '43', TO_DATE('06/01/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Bill', '77', TO_DATE('06/02/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Bill', '221', TO_DATE('06/03/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Bill', '43', TO_DATE('06/04/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    INSERT INTO TEST ( TEST.NAME, TEST.AMOUNT, TEST.TRANS_DATE ) VALUES ( 'Bill', '73', TO_DATE('06/05/2005 08:00:00 PM', 'MM/DD/YYYY HH12:MI:SS PM') );
    commit;
    /* I want to retrieve all the distinct count of amount for every row in an analytic function with COUNT(DISTINCT AMOUNT) sorted by name and ordered by trans_date where I get only calculate for the last four trans_date for each row (i.e., for the row "Anna 110 6/5/2005 8:00:00.000 PM," I only want to look at the previous dates from 6/2/2005 to 6/5/2005 and get the distinct count of how many amounts there are different for Anna). Note, I cannot use the DISTINCT keyword in this query because it doesn't work with the ORDER BY */
    select NAME, AMOUNT, TRANS_DATE, COUNT(/*DISTINCT*/ AMOUNT) over ( partition by NAME
    order by TRANS_DATE range between numtodsinterval(3,'day') preceding and current row ) as COUNT_AMOUNT
    from TEST t;
    This is the results I get if I just count all the AMOUNT without using distinct:
    NAME     AMOUNT     TRANS_DATE     COUNT_AMOUNT
    Anna 110 6/1/2005 8:00:00.000 PM     2
    Anna 20 6/1/2005 8:00:00.000 PM     2
    Anna 110     6/2/2005 8:00:00.000 PM     3
    Anna 21     6/3/2005 8:00:00.000 PM     4
    Anna 68     6/4/2005 8:00:00.000 PM     5
    Anna 110     6/5/2005 8:00:00.000 PM     4
    Anna 20     6/6/2005 8:00:00.000 PM     4
    Bill 43     6/1/2005 8:00:00.000 PM     1
    Bill 77     6/2/2005 8:00:00.000 PM     2
    Bill 221     6/3/2005 8:00:00.000 PM     3
    Bill 43     6/4/2005 8:00:00.000 PM     4
    Bill 73     6/5/2005 8:00:00.000 PM     4
    The COUNT_DISTINCT_AMOUNT is the desired output:
    NAME     AMOUNT     TRANS_DATE     COUNT_DISTINCT_AMOUNT
    Anna     110     6/1/2005 8:00:00.000 PM     1
    Anna     20     6/1/2005 8:00:00.000 PM     2
    Anna     110     6/2/2005 8:00:00.000 PM     2
    Anna     21     6/3/2005 8:00:00.000 PM     3
    Anna     68     6/4/2005 8:00:00.000 PM     4
    Anna     110     6/5/2005 8:00:00.000 PM     3
    Anna     20     6/6/2005 8:00:00.000 PM     4
    Bill     43     6/1/2005 8:00:00.000 PM     1
    Bill     77     6/2/2005 8:00:00.000 PM     2
    Bill     221     6/3/2005 8:00:00.000 PM     3
    Bill     43     6/4/2005 8:00:00.000 PM     3
    Bill     73     6/5/2005 8:00:00.000 PM     4
    Thanks in advance.

    you can try to write your own udag.
    here is a fake example, just to show how it "could" work. I am here using only 1,2,4,8,16,32 as potential values.
    create or replace type CountDistinctType as object
       bitor_number number,
       static function ODCIAggregateInitialize(sctx IN OUT CountDistinctType) 
         return number,
       member function ODCIAggregateIterate(self IN OUT CountDistinctType, 
         value IN number) return number,
       member function ODCIAggregateTerminate(self IN CountDistinctType, 
         returnValue OUT number, flags IN number) return number,
        member function ODCIAggregateMerge(self IN OUT CountDistinctType,
          ctx2 IN CountDistinctType) return number
    create or replace type body CountDistinctType is 
    static function ODCIAggregateInitialize(sctx IN OUT CountDistinctType) 
    return number is 
    begin
       sctx := CountDistinctType('');
       return ODCIConst.Success;
    end;
    member function ODCIAggregateIterate(self IN OUT CountDistinctType, value IN number)
      return number is
      begin
        if (self.bitor_number is null) then
          self.bitor_number := value;
        else
          self.bitor_number := self.bitor_number+value-bitand(self.bitor_number,value);
        end if;
        return ODCIConst.Success;
      end;
      member function ODCIAggregateTerminate(self IN CountDistinctType, returnValue OUT
      number, flags IN number) return number is
      begin
        returnValue := 0;
        for i in 0..log(2,self.bitor_number) loop
          if (bitand(power(2,i),self.bitor_number)!=0) then
            returnValue := returnValue+1;
          end if;
        end loop;
        return ODCIConst.Success;
      end;
      member function ODCIAggregateMerge(self IN OUT CountDistinctType, ctx2 IN
      CountDistinctType) return number is
      begin
        return ODCIConst.Success;
      end;
      end;
    CREATE or REPLACE FUNCTION CountDistinct (n number) RETURN number 
    PARALLEL_ENABLE AGGREGATE USING CountDistinctType;
    drop table t;
    create table t as select rownum r, power(2,trunc(dbms_random.value(0,6))) p from all_objects;
    SQL> select r,p,countdistinct(p) over (order by r) d from t where rownum<10 order by r;
             R          P          D
             1          4          1
             2          1          2
             3          8          3
             4         32          4
             5          1          4
             6         16          5
             7         16          5
             8          4          5
             9          4          5buy some good book if you want to start at writting your own "distinct" algorythm.
    Message was edited by:
    Laurent Schneider
    a simpler but memory killer algorithm would use a plsql table in an udag and do the count(distinct) over that table to return the value

  • Analytic function problem

    Hi,
    I have a problem using analytic function: when I execute this query
    SELECT TSIUPSITE, TSIUPCEAN , TSIUPDATE, sum(TSIUPCA) TSIUPCA, TSIUPCTVA,TSIUPP4N,TSIUPPIEC,
    sum(TSIUPQTE) TSIUPQTE,sum(TSIUPQTEP) TSIUPQTEP, TSIUPMDIU,TSIUPMDar,
    sum(TSIUPCRIU) TSIUPCRIU,sum(TSIUPCRAR) TSIUPCRAR, trunc(TSIUPDCRE) TSIUPDCRE ,trunc(TSIUPDMAJ) TSIUPDMAJ ,
    TSIUPUTIL,TSIUPTRT,TSIUPNERR,TSIUPMESS,
    TSIUPTMVT,TSIUPSMAN, TSIUPMOTIF, sum(TSIUPMHT) TSIUPMHT, 0 vtanfisc,
    TSIUPDATEVERIF,TSIUPNSEQ,TSIUPCINV ,count(*) over (partition by TSIUPSITE,TSIUPCEAN,TSIUP_TRT ) CONTA_ARTICOLO
    FROM TST_FLIISR_VTEREMART
    WHERE 1=1 --TSIUP_TRT = 1
    AND TSIUPDATE=to_date('27082012','ddmmyyyy')
    and TSIUP_NTRX =172
    AND TSIUPSITE = 10025
    AND TSIUPCEAN = '8012452018825'
    GROUP BY TSIUPSITE, TSIUPCEAN , TSIUPDATE, TSIUPCTVA,TSIUPP4N,TSIUPPIEC,
    TSIUPMDIU,TSIUPMDar, trunc(TSIUPDCRE),trunc(TSIUPDMAJ),TSIUPUTIL,TSIUPTRT,TSIUPNERR,TSIUPMESS,
    TSIUPTMVT,TSIUPSMAN, TSIUPMOTIF, 0,
    TSIUPDATEVERIF,TSIUPNSEQ,TSIUPCINV
    ORDER BY TSIUPSITE,TSIUPDATE ;
    I have the error ORA-00979: not a GROUP BY expression related to TSIUP_TRT field,infact, if I execute this one
    SELECT TSIUPSITE, TSIUPCEAN , TSIUPDATE, sum(TSIUPCA) TSIUPCA, TSIUPCTVA,TSIUPP4N,TSIUPPIEC,
    sum(TSIUPQTE) TSIUPQTE,sum(TSIUPQTEP) TSIUPQTEP, TSIUPMDIU,TSIUPMDar,
    sum(TSIUPCRIU) TSIUPCRIU,sum(TSIUPCRAR) TSIUPCRAR, trunc(TSIUPDCRE) TSIUPDCRE ,trunc(TSIUPDMAJ) TSIUPDMAJ ,
    TSIUPUTIL,TSIUPTRT,TSIUPNERR,TSIUPMESS,
    TSIUPTMVT,TSIUPSMAN, TSIUPMOTIF, sum(TSIUPMHT) TSIUPMHT, 0 vtanfisc,
    TSIUPDATEVERIF,TSIUPNSEQ,TSIUPCINV ,count(*) over (partition by TSIUPSITE,TSIUPCEAN ) CONTA_ARTICOLO
    FROM TST_FLIISR_VTEREMART
    WHERE 1=1 --TSIUP_TRT = 1
    AND TSIUPDATE=to_date('27082012','ddmmyyyy')
    and TSIUP_NTRX =172
    AND TSIUPSITE = 10025
    AND TSIUPCEAN = '8012452018825'
    GROUP BY TSIUPSITE, TSIUPCEAN , TSIUPDATE, TSIUPCTVA,TSIUPP4N,TSIUPPIEC,
    TSIUPMDIU,TSIUPMDar, trunc(TSIUPDCRE),trunc(TSIUPDMAJ),TSIUPUTIL,TSIUPTRT,TSIUPNERR,TSIUPMESS,
    TSIUPTMVT,TSIUPSMAN, TSIUPMOTIF, 0,
    TSIUPDATEVERIF,TSIUPNSEQ,TSIUPCINV
    ORDER BY TSIUPSITE,TSIUPDATE ;
    I have no problem. Now the difference between TSIUPCEAN ( or TSIUPSITE) and TSIUP_TRT is that TSIUP_TRT is not in Group By clause, but, to be honest, I don't know why I have this problem using using an analitic function.
    Thanks for help

    Hi,
    I think you are not using analytic function properly.
    Analytical functions will execute for each row. Where as Group BY will execute for groups of data.
    See below example for you reference.
    Example 1:
    -- Below query displays number of employees for each department. Since we have used analytical function for each row you are getting the number of employees based on the department id.
    SQL> SELECT e.department_id,count(*) OVER (PARTITION BY e.department_id) cnt_analytic
      2  FROM employees e
      3  WHERE e.department_id IN (10,20,30);
    DEPARTMENT_ID CNT_ANALYTIC
               10            1
               20            2
               20            2
               30            6
               30            6
               30            6
               30            6
               30            6
               30            6
    9 rows selected.
    Example 2:
    -- Since I have used GROUP BY clause I'm getting only single row for each department.
    SQL> SELECT e.department_id, count(*) cnt_group
      2  FROM employees e
      3  WHERE e.department_id IN (10,20,30)
      4  GROUP BY e.department_id;
    DEPARTMENT_ID  CNT_GROUP
               10          1
               20          2
               30          6Finally, what I'm trying to explain you is - If you use Analytical function with GROUP BY clause, the query will not give the menaing ful result set.
    See below
    SQL> SELECT e.department_id,count(*) OVER (PARTITION BY e.department_id) cnt_analytic, count(*) cnt_grp
      2  FROM employees e
      3  WHERE e.department_id IN (10,20,30)
      4  GROUP BY e.department_id;
    DEPARTMENT_ID CNT_ANALYTIC    CNT_GRP
               10            1          1
               20            1          2
               30            1          6

  • How to use sum analytic function in adf

    Hi
    jdev 11.1.1.5
    oracle 11g r2
    I want to use analytic function (sum,count,avg and ...) .
    I see [url http://andrejusb.blogspot.co.uk/2013/02/oracle-analytic-functions-for-total-and.html]Oracle Analytic Functions for Total and Average Calculation in ADF BC
    and use it in my vo and jsf page,my vo have too much record and I want to have sum in table footer on demand (because of performance) and if user do not want to see the sum in footer of table it do not calculate sum,
    what is your idea?

    Before I read that blog I use another vo for sum but after that blog decide to use analytic fuction becuase we have some page that have to many dvt graph and table and know we use seperate vo for them and it has not good performance and too many query must run in database ,I want to have 1 vo with some analytic function for graph and tables

  • Using analytical functions

    I need to categorize the entries in col c1 as follows:
    1. if the entry in col c1 has only positive values in col c2, then that entry in col c1 gets a category of PRD.
    2. if the entry in col c1 has only negative values in col c2, then that entry in col c1 gets a category of RMT.
    3. if the entry in col c1 has both positive and negative values in col c2, then that entry in col c1 gets a category of INT.
    Here's the data table:
    CREATE TABLE K_TST
    C1 VARCHAR2(10),
    C2 NUMBER
    c1     c2
    a     1
    a     -1
    a     -3
    a     2
    a     -2
    b     1
    c     -1
    d     1
    d     2
    d     3
    So I use the following query:
    select a.c1,
         a.init_category,
         count(*) over (partition by a.c1) category_count,
         decode(count(*) over (partition by a.c1), 1, a.init_category, 'INT') final_category
    from
         select distinct
              c1,
              decode(instr(to_char(c2), '-'), 0, 'PRD', 'RMT') init_category
         from k_tst
    ) a
    The idea is that I assign only categories PRD and RMT in the sub-query and then use the analytical function to count if an entry in col c1 belongs to more than one category. If it belongs to more than one category in the subquery, then the category is reassigned to INT.
    No problem, the result is:
    C1     INIT_CATEGORY     CATEGORY_COUNT     FINAL_CATEGORY
    a     PRD          2          INT
    a     RMT          2          INT
    b     PRD          1          PRD
    c     RMT          1          RMT
    d     PRD          1          PRD
    The report that I want is without INIT_CATEGORY col and only distinct values, so I modify the query from above to this:
    select distinct
         a.c1,
    --     a.init_category,
         count(*) over (partition by a.c1) category_count,
         decode(count(*) over (partition by a.c1), 1, a.init_category, 'INT') final_category
    from
         select distinct
              c1,
              decode(instr(to_char(c2), '-'), 0, 'PRD', 'RMT') init_category
         from k_tst
    ) a
    The result is:
    C1     CATEGORY_COUNT     FINAL_CATEGORY
    a     5          INT
    b     1          PRD
    c     1          RMT
    d     3          INT
    Note the the CATEGORY_COUNT for 'a' changed to 5 and CATEGORY_COUNT for 'd' changed to 3. So 'd' is now categorized as INT instead of the desired category PRD (all entries in col c2 for 'd' are positive).
    Why did the results of CATEGORY_COUNT change by merely adding the 'distinct' to the outer query?
    Thanks for the time to answer this question.

    I need to categorize the entries in col c1 as follows:
    1. if the entry in col c1 has only positive values in col c2, then that entry in col c1 gets a category of PRD.
    2. if the entry in col c1 has only negative values in col c2, then that entry in col c1 gets a category of RMT.
    3. if the entry in col c1 has both positive and negative values in col c2, then that entry in col c1 gets a category of INT.
    Here's the data table:
    CREATE TABLE K_TST
    C1 VARCHAR2(10),
    C2 NUMBER
    c1     c2
    a     1
    a     -1
    a     -3
    a     2
    a     -2
    b     1
    c     -1
    d     1
    d     2
    d     3
    So I use the following query:
    select a.c1,
         a.init_category,
         count(*) over (partition by a.c1) category_count,
         decode(count(*) over (partition by a.c1), 1, a.init_category, 'INT') final_category
    from
         select distinct
              c1,
              decode(instr(to_char(c2), '-'), 0, 'PRD', 'RMT') init_category
         from k_tst
    ) a
    The idea is that I assign only categories PRD and RMT in the sub-query and then use the analytical function to count if an entry in col c1 belongs to more than one category. If it belongs to more than one category in the subquery, then the category is reassigned to INT.
    No problem, the result is:
    C1     INIT_CATEGORY     CATEGORY_COUNT     FINAL_CATEGORY
    a     PRD          2          INT
    a     RMT          2          INT
    b     PRD          1          PRD
    c     RMT          1          RMT
    d     PRD          1          PRD
    The report that I want is without INIT_CATEGORY col and only distinct values, so I modify the query from above to this:
    select distinct
         a.c1,
    --     a.init_category,
         count(*) over (partition by a.c1) category_count,
         decode(count(*) over (partition by a.c1), 1, a.init_category, 'INT') final_category
    from
         select distinct
              c1,
              decode(instr(to_char(c2), '-'), 0, 'PRD', 'RMT') init_category
         from k_tst
    ) a
    The result is:
    C1     CATEGORY_COUNT     FINAL_CATEGORY
    a     5          INT
    b     1          PRD
    c     1          RMT
    d     3          INT
    Note the the CATEGORY_COUNT for 'a' changed to 5 and CATEGORY_COUNT for 'd' changed to 3. So 'd' is now categorized as INT instead of the desired category PRD (all entries in col c2 for 'd' are positive).
    Why did the results of CATEGORY_COUNT change by merely adding the 'distinct' to the outer query?
    Thanks for the time to answer this question.

  • Self-join query to Analytical function query

    Hi All,
    I have converted a self-join query to Analytical function query due to the performance reasons.
    Query which is using Analytical function is giving the correct count as I compared it with query using Self-Join. Can you please tell what is wrong in the query.
    ==========================
    Query using Self-Join
    select count(1)
    From (select t1.*, max(t1.dw_creation_dt) over (partition by t1.empl_id) pers_max_date
    from ohr_pers_curr t1 ) pers
         , (select t2.*, max(t2.dw_creation_dt) over (partition by t2.empl_id, t2.empl_rcd) job_max_date
         from OHR_JOB_CURR t2) job
    where pers.empl_id = job.empl_id
    and pers.dw_creation_dt=pers.pers_max_date
    and job.dw_creation_dt=job.job_max_date
    and job.dummy_row_flag = 'N'
    and pers.dw_creation_rsn_cd in ('N', 'U')
    and job.dw_creation_rsn_cd in ('N', 'U')
    ================================================
    Query Using Analytical function
    select count(1)
    From (select t1.*, max(t1.dw_creation_dt) over (partition by t1.empl_id) pers_max_date
    from ohr_pers_curr t1 ) pers
         , (select t2.*, max(t2.dw_creation_dt) over (partition by t2.empl_id, t2.empl_rcd) job_max_date
         from OHR_JOB_CURR t2) job
    where pers.empl_id = job.empl_id
    and pers.dw_creation_dt=pers.pers_max_date
    and job.dw_creation_dt=job.job_max_date
    and job.dummy_row_flag = 'N'
    and pers.dw_creation_rsn_cd in ('N', 'U')
    and job.dw_creation_rsn_cd in ('N', 'U')
    ==================================

    Hi David,
    The base is same but the problem is different.
    As far as implementation concern these queries looks same, but when I see there counts, they do not match. I do not have any reason why this happening.
    Regards
    Gaurav

  • Analytical function count(*) with order by Rows unbounded preceding

    Hi
    I have query about analytical function count(*) with order by (col) ROWS unbounded preceding.
    If i removed order by rows unbouned preceding then it behaves some other way.
    Can anybody tell me what is the impact of order by ROWS unbounded preceding with count(*) analytical function?
    Please help me and thanks in advance.

    Sweety,
    CURRENT ROW is the default behaviour of the analytical function if no windowing clause is provided. So if you are giving ROWS UNBOUNDED PRECEDING, It basically means that you want to compute COUNT(*) from the beginning of the window to the current ROW. In other words, the use of ROWS UNBOUNDED PRECEDING is to implicitly indicate the end of the window is the current row
    The beginning of the window of a result set will depend on how you have defined your partition by clause in the analytical function.
    If you specify ROWS 2 preceding, then it will calculate COUNT(*) from 2 ROWS prior to the current row. It is a physical offset.
    Regards,
    Message was edited by:
    henryswift

Maybe you are looking for