Expiring Today—Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17


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

Posted on 2004-09-24
Medium Priority
Last Modified: 2008-01-09
I have two tables:

Table A has the following fields

Table B has the following fields

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?


Question by:jrollins138
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
LVL 15

Accepted Solution

andrewst earned 600 total points
ID: 12144440
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

Assisted Solution

Jankovsky earned 600 total points
ID: 12144457
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')
LVL 15

Expert Comment

ID: 12144554
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

Author Comment

ID: 12145042
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.


Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

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…
Using SQL Scripts we can save all the SQL queries as files that we use very frequently on our database later point of time. This is one of the feature present under SQL Workshop in Oracle Application Express.
This video explains at a high level about the four available data types in Oracle and how dates can be manipulated by the user to get data into and out of the database.
This video shows setup options and the basic steps and syntax for duplicating (cloning) a database from one instance to another. Examples are given for duplicating to the same machine and to different machines

719 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