Solved

SUM qty in a select statement not working

Posted on 2013-05-28
18
339 Views
Last Modified: 2013-05-28
Hi

im needing a little bit of help with this query i should be getting 1 row returned and i get none and the req qty is greater than, so im trying to add this -> TB.ReqQty > SUM(KV.Qty) but im getting error msg - An aggregate cannot appear in an ON clause unless it is in a subquery contained in a HAVING clause or select list, and the column being aggregated is an outer reference.


is there a way i can get the sum to work?

  SELECT  
     TB.Job as 'JOB'  
   , TB.Component as 'SERIAL'  
   , TB.ReqQty as 'QTY'    
  FROM (  
   select row_number() over (partition by Job,Component ORDER BY ReqQty) rownum, *  
   from TblBOM WITH (NOLOCK)) TB  
  LEFT JOIN (  
   select row_number() over (partition by WORKORDER,PARTNUMBER ORDER BY Qty) rownum, *  
   from kitverify) KV ON ((TB.Job = KV.[WORKORDER])  
   AND TB.Component = KV.[PARTNUMBER])
   AND KV.rownum = TB.rownum
   AND TB.ReqQty > SUM(KV.Qty)
 WHERE ((KV.[WORKORDER] IS NULL)  
   AND (KV.[PARTNUMBER]) IS NULL  
   AND (TB.Job = 'PMM1320002'))  


thanks
0
Comment
Question by:razza_b
  • 9
  • 4
  • 4
  • +1
18 Comments
 
LVL 9

Assisted Solution

by:sarabhai
sarabhai earned 200 total points
Comment Utility
try this one and let me know what happen

SELECT  
     TB.Job as 'JOB'  
   , TB.Component as 'SERIAL'  
   , TB.ReqQty as 'QTY'    
  FROM (  
   select row_number() over (partition by Job,Component ORDER BY ReqQty) rownum, *  
   from TblBOM WITH (NOLOCK)) TB  
  LEFT JOIN (  
   select row_number() over (partition by WORKORDER,PARTNUMBER ORDER BY Qty) rownum, *  
   from kitverify) KV ON ((TB.Job = KV.[WORKORDER])  
   AND TB.Component = KV.[PARTNUMBER])
   AND KV.rownum = TB.rownum
   AND TB.ReqQty > ( select SUM(KV1.Qty) from kitverify KV1 where TB.Job = KV1.[WORKORDER]  )
 WHERE ((KV.[WORKORDER] IS NULL)  
   AND (KV.[PARTNUMBER]) IS NULL  
   AND (TB.Job = 'PMM1320002'))
0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
it brings me back all of my 13 rows now, because i have entered in data for 12 rows i should only be getting one row back.
0
 
LVL 22

Expert Comment

by:Thomasian
Comment Utility
Try
SELECT
	TB.Job AS 'JOB'
	,TB.Component  AS 'SERIAL'
	,TB.ReqQty as 'QTY'
FROM
	TblBOM TB
WHERE
	TB.Job = 'PMM1320002' AND
	TB.ReqQty > (SELECT SUM(Qty) FROM kitverify WHERE TB.Job = [WORKORDER] AND TB.Component = [PARTNUMBER])

Open in new window

0
 
LVL 48

Expert Comment

by:PortletPaul
Comment Utility
I had a query prepared to enter here, then  went back over it and, well I need to check

I think you are trying to match a job to a workorder through a partnumber.
the workorder should have a smaller (or equal?) qty to the job requirement.

is this correct?
0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
i get the msg..

An aggregate cannot appear in an ON clause unless it is in a subquery contained in a HAVING clause or select list, and the column being aggregated is an outer reference.


but i have tried this and get my one row back but still unsure as the req qty should be greater than...

SELECT  
     TB.Job as 'JOB'  
   , TB.Component as 'SERIAL'  
   , TB.ReqQty as 'QTY'    
  FROM (  
   select row_number() over (partition by Job,Component ORDER BY ReqQty) rownum, *  
   from TblBOM WITH (NOLOCK)) TB  
  LEFT JOIN (  
   select row_number() over (partition by WORKORDER,PARTNUMBER ORDER BY Qty) rownum, *  
   from kitverify) KV ON ((TB.Job = KV.[WORKORDER])  
   AND TB.Component = KV.[PARTNUMBER])
   AND KV.rownum = TB.rownum
   AND TB.ReqQty <= ( select SUM(KV.Qty) from kitverify KV where TB.Job = KV.[WORKORDER] and TB.Component = KV.[PARTNUMBER] ) WHERE ((KV.[WORKORDER] IS NULL)  
   AND (KV.[PARTNUMBER]) IS NULL  
   AND (TB.Job = 'PMM1320002'))
0
 
LVL 48

Expert Comment

by:PortletPaul
Comment Utility
I would suggest you try the suggestion by: Thomasian above
I think this meets your need.
0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
PortletPaul i think you could be correct as i get my one row back but unsure why in needs to be <= ??
0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
i tried thomasian 2nd query and it didnt return anything, i think its because its null in kitverify table(but when it does have a qty it will return but only if it has an actual qty less than the TB.ReqQty
0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
is there a way i can add to that query if its null make it 0?
0
Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

 
LVL 48

Expert Comment

by:PortletPaul
Comment Utility
try something like this perhaps
SELECT
	  TB.Job AS 'JOB'
	, TB.Component  AS 'SERIAL'
	, TB.ReqQty as 'QTY'
    , case when TB.ReqQty <= KT.sumqty then WORKORDER else 'No Workorder Matches' end as matching
FROM 	TblBOM TB
left join (
           select [WORKORDER] , [PARTNUMBER], sum(qty) over (partition by [WORKORDER] , [PARTNUMBER]) as sumqty
           FROM kitverify
          ) KT ON TB.Job = KT.[WORKORDER] AND TB.Component = KT.[PARTNUMBER]
WHERE 	TB.Job = 'PMM1320002' 

Open in new window

0
 
LVL 48

Expert Comment

by:PortletPaul
Comment Utility
not I don't know if you really need to do that sum()
0
 
LVL 22

Expert Comment

by:Thomasian
Comment Utility
Can you post some sample data with the expected result?
0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
this seems to be the only one that returns the one row but dont get how it works when it is <=

SELECT  
     TB.Job as 'JOB'  
   , TB.Component as 'SERIAL'  
   , TB.ReqQty as 'QTY'    
  FROM (  
   select row_number() over (partition by Job,Component ORDER BY ReqQty) rownum, *  
   from TblBOM WITH (NOLOCK)) TB  
  LEFT JOIN (  
   select row_number() over (partition by WORKORDER,PARTNUMBER ORDER BY Qty) rownum, *  
   from kitverify) KV ON ((TB.Job = KV.[WORKORDER])  
   AND TB.Component = KV.[PARTNUMBER])
   AND KV.rownum = TB.rownum
   AND TB.ReqQty <= ( select SUM(KV.Qty) from kitverify KV where TB.Job = KV.[WORKORDER] and TB.Component = KV.[PARTNUMBER] ) WHERE ((KV.[WORKORDER] IS NULL)  
   AND (KV.[PARTNUMBER]) IS NULL  
   AND (TB.Job = 'PMM1320002'))
0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
JOB                      SERIAL                                      QTY
PMM1320002        MT41K256M8DA125K        36666

thats the output so when my data being entered eventually reaches that qty or more then no rows left (its a multi serial scan)
0
 
LVL 22

Accepted Solution

by:
Thomasian earned 300 total points
Comment Utility
You mentioned earlier that the query does not work when qty is null on table kitverify. You can try adding ISNULL to return 0 instead. Try if this works
SELECT
	TB.Job AS 'JOB'
	,TB.Component  AS 'SERIAL'
	,TB.ReqQty as 'QTY'
FROM
	TblBOM TB
WHERE
	TB.Job = 'PMM1320002' AND
	TB.ReqQty > (SELECT ISNULL(SUM(Qty),0) FROM kitverify WHERE TB.Job = [WORKORDER] AND TB.Component = [PARTNUMBER])

Open in new window

0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
its weird i get the same output from both these queries...

SELECT
      TB.Job AS 'JOB'
      ,TB.Component  AS 'SERIAL'
      ,TB.ReqQty as 'QTY'
FROM
      TblBOM TB
WHERE
      TB.Job = 'PMM1320002' AND
      TB.ReqQty > (SELECT ISNULL(SUM(Qty),0) FROM kitverify WHERE TB.Job = [WORKORDER] AND TB.Component = [PARTNUMBER])



SELECT  
     TB.Job as 'JOB'  
   , TB.Component as 'SERIAL'  
   , TB.ReqQty as 'QTY'    
  FROM (  
   select row_number() over (partition by Job,Component ORDER BY ReqQty) rownum, *  
   from TblBOM WITH (NOLOCK)) TB  
  LEFT JOIN (  
   select row_number() over (partition by WORKORDER,PARTNUMBER ORDER BY Qty) rownum, *  
   from kitverify) KV ON ((TB.Job = KV.[WORKORDER])  
   AND TB.Component = KV.[PARTNUMBER])
   AND KV.rownum = TB.rownum
   AND TB.ReqQty <= ( select SUM(KV.Qty) from kitverify KV where TB.Job = KV.[WORKORDER] and TB.Component = KV.[PARTNUMBER] ) WHERE ((KV.[WORKORDER] IS NULL)  
   AND (KV.[PARTNUMBER]) IS NULL  
   AND (TB.Job = 'PMM1320002'))
0
 
LVL 22

Expert Comment

by:Thomasian
Comment Utility
Is the output correct?

If not, can you some sample data and the desired output? I don't really understand why you need to get a row number for each table..
0
 
LVL 1

Author Comment

by:razza_b
Comment Utility
yes output looks correct and i like the query you supplied is much simpler and quicker.

i cant actually remember why rownum is being used think it was just to get remaining rows but seems to be long winded way.
0

Featured Post

Zoho SalesIQ

Hassle-free live chat software re-imagined for business growth. 2 users, always free.

Join & Write a Comment

Everyone has problem when going to load data into Data warehouse (EDW). They all need to confirm that data quality is good but they don't no how to proceed. Microsoft has provided new task within SSIS 2008 called "Data Profiler Task". It solve th…
If you have heard of RFC822 date formats, they can be quite a challenge in SQL Server. RFC822 is an Internet standard format for email message headers, including all dates within those headers. The RFC822 protocols are available in detail at:   ht…
Via a live example, show how to extract insert data into a SQL Server database table using the Import/Export option and Bulk Insert.
Via a live example, show how to shrink a transaction log file down to a reasonable size.

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

7 Experts available now in Live!

Get 1:1 Help Now