2012-03-12 107 views
3

我有這個疑問:我如何擺脫這些子選擇?

select distinct pdi.height, pdi.width, pj.jobnum 
     , (select count(barcode) from productiondoorinformation 
      inner join view_productionjobs on view_productionjobs.ctr=productiondoorinformation.productionjobsctr 
       where view_productionjobs.jobnum=pj.jobnum 
        and productiondoorinformation.height=pdi.height 
        and productiondoorinformation.width=pdi.width 
        and productiondoorinformation.alternaterating='PARTICLE') as particleqty 
     , (select count(barcode) from productiondoorinformation 
      inner join view_productionjobs on view_productionjobs.ctr=productiondoorinformation.productionjobsctr 
       where view_productionjobs.jobnum=pj.jobnum 
        and productiondoorinformation.height=pdi.height 
        and productiondoorinformation.width=pdi.width 
        and productiondoorinformation.alternaterating<>'PARTICLE') as laminatedqty 

    from productiondoorinformation pdi inner join view_productionjobs pj on pj.ctr=pdi.productionjobsctr 
       where pj.jobnum='' + @Jobnum + '' 

必須有一個更好的方式是一個更好的方式來做到這一點。我討厭這些子選集,但是沒有足夠的精力去重寫沒有它們的東西。子查詢有兩種不同的數量,當你看到每個子句的where子句時,你會注意到這兩個數量。

該查詢需要9秒鐘才能執行。太長了。我對這些表格寫的任何其他查詢都會立即返回。有什麼建議麼?我嘗試了group by等,但只能使其以某種方式工作(粒子或粒子),但不能同時使用這兩種方法。

返回的數據應該是這樣的:

height | width | jobnum | particleqty | laminatedqty 
79  49  t1000 10   5 
78  49  t1000 1   3 
79  47  t1000 15   0 

回答

6

你是在正確的軌道上。您應該能夠使用SUM,而不是COUNTGROUP BY

select pdi.height, pdi.width, pj.jobnum, 
     SUM(CASE pdi.alternaterating WHEN 'PARTICLE' THEN 1 ELSE 0 END) particleqty, 
     SUM(CASE pdi.alternaterating WHEN 'PARTICLE' THEN 0 ELSE 1 END) laminatedqty 
from productiondoorinformation pdi 
    inner join view_productionjobs pj on pj.ctr=pdi.productionjobsctr 
    where pj.jobnum='' + @Jobnum + '' 
group by pdi.height, pdi.width, pj.jobnum 

順便說一句,不知道你需要大約@Jobnum那些單('')報價...

+0

+1 - 你的想法和我的一樣,只有更好! – 2012-03-12 21:41:33

+0

我會再試一次,我希望它可以工作,但它今天不早。它不斷將所有內容都彙總成疊層。我可能只是在錯誤的地方有東西。任何人,我會放手一搏。 – 2012-03-12 21:51:23

+0

如果'productiondoorinformation.alternaterating'不爲null,這將正確工作。 – 2012-03-12 21:54:05

2

只是一個快速脫開 - 爲什麼不要將內部查詢寫成簡單表格

CASE WHEN alternaterating = 'PARTICLE' THEN 1 ELSE 0 

然後查詢該表格嗎?