Solved

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

Posted on 2008-10-08
2
150 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
[X]
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 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

Enterprise Mobility and BYOD For Dummies

Like “For Dummies” books, you can read this in whatever order you choose and learn about mobility and BYOD; and how to put a competitive mobile infrastructure in place. Developed for SMBs and large enterprises alike, you will find helpful use cases, planning, and implementation.

Question has a verified solution.

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

In the first part of this tutorial we will cover the prerequisites for installing SQL Server vNext on Linux.
A Stored Procedure in Microsoft SQL Server is a powerful feature that it can be used to execute the Data Manipulation Language (DML) or Data Definition Language (DDL). Depending on business requirements, a single Stored Procedure can return differe…
Using examples as well as descriptions, and references to Books Online, show the documentation available for date manipulation functions and by using a select few of these functions, show how date based data can be manipulated with these functions.
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.

632 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