我有这个问题:
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等,但只能让它以某种方式工作(粒子或&lt;&gt;粒子),但不能同时工作。
返回的数据应如下所示:
height | width | jobnum | particleqty | laminatedqty
79 49 t1000 10 5
78 49 t1000 1 3
79 47 t1000 15 0
答案 0 :(得分:6)
你走在正确的轨道上。您应该可以使用SUM
代替COUNT
和GROUP 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周围是否需要那些单引号(''
)...
答案 1 :(得分:2)
快速抛弃 - 为什么不将内部查询编写为带有
的简单表CASE WHEN alternaterating = 'PARTICLE' THEN 1 ELSE 0
然后查询该表?