Solved

Oracle SQL: how to summarize detail records into multiple header fields

Posted on 2004-09-24
4
825 Views
Last Modified: 2008-01-09
I have two tables:

Table A has the following fields
  Key
  Total1
  Total2
  Total3

Table B has the following fields
  Key
  Date
  Status

Tables A and B are joined with the field "Key". Table B has multiple records for each given value in "Key". There is a "one-to-many" relationship between A and B.

How do I accumulate values in A per the following rules?

For each record in table A
  Read all records in table B that match A.Key = B.Key
     If B.Status = "A" then increment A.Total1 by 1
     If B.Status = "B" then increment A.Total2 by 1
     If B.Status = "C" then increment A.Total3 by 1

The following shows the resulting tables

A.Key  A.Total1     A.Total2      A.Total3
AAAA      3                 2                0
BBBB       2                 1                2
CCCC      0                 0                0

B.Key  B.Date          B.Status
AAAA 01/01/2001         A
AAAA 01/02/2001         B
AAAA 01/03/2001         A
AAAA 01/04/2001         B
AAAA 01/05/2001         A
BBBB  02/01/2001         C
BBBB  02/02/2001         A
BBBB  03/01/2001         A
BBBB  04/01/2001         B
BBBB  05/01/2001         C

Can this be done with SQL?

Thanks,

Jim
0
Comment
Question by:jrollins138
  • 2
4 Comments
 
LVL 15

Accepted Solution

by:
andrewst earned 150 total points
Comment Utility
update a set (total1, total2, total3) =
(
select sum(decode(b.status,'A',1,0))
, sum(decode(b.status,'B',1,0))
, sum(decode(b.status,'C',1,0))
from b where b.key = a.key
);
0
 
LVL 6

Assisted Solution

by:Jankovsky
Jankovsky earned 150 total points
Comment Utility
Update A set A.Total1=NVL(A.Total1,0)+(select count(1) from B where A.KEY=B.KEY and B.STATUS='A')
 ,A.Total2=NVL(A.Total1,0)+(select count(1) from B where A.KEY=B.KEY and B.STATUS='B')
 ,A.Total3=NVL(A.Total1,0)+(select count(1) from B where A.KEY=B.KEY and B.STATUS='C')
0
 
LVL 15

Expert Comment

by:andrewst
Comment Utility
Sorry, my previous answer overwrites ratehr than increments the totals.  SHould be:

update a set (total1, total2, total3) =
(
select a.total1+sum(decode(b.status,'A',1,0))
, a.total2+sum(decode(b.status,'B',1,0))
, a.total3+sum(decode(b.status,'C',1,0))
from b where b.key = a.key
);
0
 

Author Comment

by:jrollins138
Comment Utility
Well done and many thanks to both of you. I've increased the points to 300 and would like to split them equally between you. I used elements from both answers to solve my problem.

0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Join & Write a Comment

Working with Network Access Control Lists in Oracle 11g (part 1) Part 2: http://www.e-e.com/A_9074.html So, you upgraded to a shiny new 11g database and all of a sudden every program that used UTL_MAIL, UTL_SMTP, UTL_TCP, UTL_HTTP or any oth…
Configuring and using Oracle Database Gateway for ODBC Introduction First, a brief summary of what a Database Gateway is.  A Gateway is a set of driver agents and configurations that allow an Oracle database to communicate with other platforms…
Via a live example show how to connect to RMAN, make basic configuration settings changes and then take a backup of a demo database
This video explains what a user managed backup is and shows how to take one, providing a couple of simple example scripts.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now