Solved

How to SUM() a field of a subset of child records in a query?

Posted on 2008-10-08
2
144 Views
Last Modified: 2012-06-27
I have a parent table called "proposal"  where each proposal can have one to many "proposal_lines".  A "prospect" can have one to many "proposals"

I have a query where I need to select proposals to show in a list.  Within that query, I need to sum the price of each of the line items (proposal_ln).  However, some of the line items could be marked as deleted.  I do not want those included in the sum.

The query shown below finds all the proposals I need and sums up the prices of the line items correctly.  However, this query will not show proposals where all of the proposal lines have been marked as deleted.  This is because of the WHERE clause that checks the status of the "proposal_ln".  I need to show a proposal whether or not it has all of its proposal_ln rows marked as deleted.

Somehow, I think need to have that WHERE clause in the "SUM(ln_final_extd_price)" section (an inner select??) so that the outside query still gives me ALL of the proposal records, but the SUM will ONLY sum the proposal line items that aren't marked as deleted.

Thoughts?
SELECT proposal.proposal_id,proposal.proposal_rev,prospect.prospect_name,proposal.crt_ts,proposal.proposal_eff_end_dt, SUM(ISNULL(proposal_ln.ln_final_extd_price, 0)) as final_extd_price,(ROW_NUMBER() OVER (ORDER BY proposal.crt_ts desc)) AS RecID 

  FROM [dbo].[proposal]

INNER JOIN prospect on proposal.prospect_id=prospect.prospect_id

LEFT OUTER JOIN proposal_ln ON proposal.proposal_id=proposal_ln.proposal_id

and proposal.proposal_rev=proposal_ln.proposal_rev

 WHERE proposal.prmry_sls_prsn = 'SALES'

 AND proposal.crt_ts > DATEADD(dd,-30,getDate())

 and proposal.proposal_stat_cd IN ('INCP','REDY','DLVD','EXPD')

 and ISNULL(proposal_ln.ln_stat_cd,'D') <> 'DLTD'

GROUP BY proposal.proposal_id

      ,proposal.proposal_rev

      ,prospect_name

	  ,proposal.crt_ts

	  ,proposal.proposal_eff_end_dt 

	  ,stat.stat_desc

Open in new window

0
Comment
Question by:bwaldhart
2 Comments
 
LVL 18

Accepted Solution

by:
mdougan earned 125 total points
ID: 22670859
Well, you could use a CASE statement within the SUM

SUM(
           CASE WHEN proposal_ln.ln_final_extd_price IS NULL THEN 0
                     WHEN proposal_ln.status = 'DELETED' THEN 0
                     ELSE proposal_ln.ln_final_extd_price
           END
        ) as final_extd_price

That way, you'd just be summing zero which wouldn't change the amount.
0
 

Author Closing Comment

by:bwaldhart
ID: 31504317
You're da man!  Sometimes it just takes a second set of eyes to point out a great, obvious solution.  Thanks!!!
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

If you find yourself in this situation “I have used SELECT DISTINCT but I’m getting duplicates” then I'm sorry to say you are using the wrong SQL technique as it only does one thing which is: produces whole rows that are unique. If the results you a…
PL/SQL can be a very powerful tool for working directly with database tables. Being able to loop will allow you to perform more complex operations, but can be a little tricky to write correctly. This article will provide examples of basic loops alon…
Viewers will learn how the fundamental information of how to create a table.
Viewers will learn how to use the INSERT statement to insert data into their tables. It will also introduce the NULL statement, to show them what happens when no value is giving for any given column.

706 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

19 Experts available now in Live!

Get 1:1 Help Now