[Webinar] Streamline your web hosting managementRegister Today

x
?
Solved

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

Posted on 2008-10-08
2
Medium Priority
?
156 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 500 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

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

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

Windocks is an independent port of Docker's open source to Windows.   This article introduces the use of SQL Server in containers, with integrated support of SQL Server database cloning.
In this article, we will show how to detach and attach a database and then show how to repair a corrupt database and attach it, If it has some errors. We will show how to detach and attach using SSMS or using T-SQL sentences.
Via a live example, show how to extract insert data into a SQL Server database table using the Import/Export option and Bulk Insert.
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.

607 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