Complex crosstab query

From: Timo <tim.frawley_at_alaska.gov>
Date: Thu, 25 Sep 2008 09:19:53 -0700 (PDT)
Message-ID: <4468b556-141f-4f22-8c79-5d8d2948f09a@p10g2000prf.googlegroups.com>

I am wondering if I can create a complex query in oracle that simulates an Access crosstab. The data is comprised of measurments created from fish scales. The output is based on the water type 'F' - Fresh and 'S' - Salt and the Age of the fish, 5th and 6th characters of the FISH_ID. The 5th charactrer is the Fresh water age and the 6th character is the Salt water age. Any measurements greater than the age is Plus growth. The Annulus Varchar2(1) is a boolean value 0 - False, 1 - True indicating the measurement marker for that age group.

Here is an example of our measurement data:

CREATE TABLE CIRCULUS
(

FISH_ID VARCHAR2(10),
CIRCULUS_NUMBER NUMBER,
WATER_CODE VARCHAR2(1),
ANNULUS VARCHAR2(1),
DISTANCE NUMBER
)

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',1,'F','0',0.0778);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',2,'F','0',0.0256);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',3,'F','0',0.0246);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',4,'F','0',0.042);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',5,'F','0',0.0286);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',6,'F','0',0.0266);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',7,'F','0',0.0297);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',8,'F','0',0.0143);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',9,'F','0',0.0276);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',10,'F','0',0.0205);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',11,'F','0',0.0146);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',12,'F','0',0.0202);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',13,'F','1',0.0246);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',14,'F','0',0.0327);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',15,'F','0',0.0368);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',16,'F','0',0.0247);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',17,'F','0',0.0316);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',18,'F','0',0.0276);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',19,'F','0',0.0225);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',20,'F','0',0.0194);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',21,'F','0',0.042);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',22,'S','0',0.043);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',23,'S','0',0.0583);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',24,'S','0',0.0614);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',25,'S','0',0.0481);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',26,'S','0',0.0491);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',27,'S','0',0.0379);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',28,'S','0',0.0399);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',29,'S','0',0.0379);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',30,'S','0',0.0348);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',31,'S','0',0.0348);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',32,'S','0',0.0286);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',33,'S','0',0.0358);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',34,'S','0',0.0389);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',35,'S','0',0.0368);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',36,'S','0',0.0338);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',37,'S','0',0.0317);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',38,'S','0',0.0276);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',39,'S','0',0.0348);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',40,'S','0',0.0389);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',41,'S','0',0.0358);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',42,'S','0',0.0389);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',43,'S','0',0.0368);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',44,'S','1',0.0409);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',45,'S','0',0.0471);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',46,'S','0',0.0286);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',47,'S','0',0.0358);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',48,'S','0',0.0758);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',49,'S','0',0.0601);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',50,'S','0',0.045);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',51,'S','0',0.0391);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',52,'S','0',0.0348);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',53,'S','0',0.0327);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',54,'S','0',0.0399);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',55,'S','0',0.042);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',56,'S','0',0.0419);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',57,'S','0',0.0338);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',58,'S','0',0.0358);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',59,'S','0',0.0399);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',60,'S','0',0.0368);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',61,'S','0',0.044);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',62,'S','1',0.0553);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',63,'S','0',0.0553);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',64,'S','0',0.0553);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',65,'S','0',0.0409);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',66,'S','0',0.045);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',67,'S','0',0.0491);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',68,'S','0',0.0553);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',69,'S','0',0.0379);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',70,'S','0',0.0542);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',71,'S','0',0.0481);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',72,'S','0',0.0399);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',73,'S','0',0.0409);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',74,'S','0',0.0491);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',75,'S','0',0.0443);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',76,'S','1',0.0611);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',77,'S','0',0.0501);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',78,'S','0',0.043);

insert into CIRCULUS
(FISH_ID,CIRCULUS_NUMBER,WATER_CODE,ANNULUS,DISTANCE) values
('KV0313M030',79,'S','0',0.0481);

This is an example of what the output might look like. Zone Distance is the cumulative measurements for an age group. Circuli count is a count of the circuli in the group and C1 to C30 are column headers displaying the individual measurements.

The possible ages of fish range so there could be FW2, SW4 to SW6, etc.

WATER_AGE	FISH_ID	ZONE_DISTANCE	CIRCULI_COUNT	C1	C2	C3	C4	C5	C6	C7	C8
C9	C10	C11	C12	C13	C14	C15	C16	C17	C18	C19	C20	C21	C22	C23	C24	C25	C26
C27	C28	C29	C30
FW1	KV0313M030	0.2968	12	0.0778	0.0256	0.0246	0.0420	0.0286	0.0266
0.0297	0.0143	0.0276	0.0205	0.0146	0.0202	0.0000	0.0000	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000
FWPLUS	KV0313M030	0.2619	9	0.0246	0.0327	0.0368	0.0247	0.0316	0.0276
0.0225	0.0194	0.0420	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000
SW1	KV0313M030	0.8636	22	0.0430	0.0583	0.0614	0.0481	0.0491	0.0379
0.0399	0.0379	0.0348	0.0348	0.0286	0.0358	0.0389	0.0368	0.0338	0.0317
0.0276	0.0348	0.0389	0.0358	0.0389	0.0368	0.0000	0.0000	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000
SW2	KV0313M030	0.7540	18	0.0409	0.0471	0.0286	0.0358	0.0758	0.0601
0.0450	0.0391	0.0348	0.0327	0.0399	0.0420	0.0419	0.0338	0.0358	0.0399
0.0368	0.0440	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000
SW3	KV0313M030	0.6706	14	0.0553	0.0553	0.0553	0.0409	0.0450	0.0491
0.0553	0.0379	0.0542	0.0481	0.0399	0.0409	0.0491	0.0443	0.0000
SWPLUS	KV0313M030	0.2023	4	0.0611	0.0501	0.0430	0.0481	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000	0.0000
0.0000	0.0000	0.0000	0.0000



Anyone out there willing to give this a try? Received on Thu Sep 25 2008 - 11:19:53 CDT

Original text of this message