2012-03-12 5 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 для каждого.

Этот запрос занимает девять секунд. Это слишком долго. Любой другой запрос, который я написал против этих таблиц, немедленно возвращается. Какие-либо предложения? Я пробовал группу и т. Д., Но могу заставить ее работать так или иначе (частица или <> частица), но не оба.

Возвращаемые данные должны выглядеть следующим образом:

height | width | jobnum | particleqty | laminatedqty 
79  49  t1000 10   5 
78  49  t1000 1   3 
79  47  t1000 15   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 ...

+0

+1 - Ваша идея такая же, как у меня, только лучше! –

+0

Я собираюсь попробовать это снова, и я надеюсь, что это сработает, но сегодня это не было. Он продолжал суммировать все в ламинированную партию. Я, вероятно, просто что-то не в том месте. Anywho, я отдам его. –

+0

Это будет работать правильно, если 'productiondoorinformation.alternaterating' не является нулевым. –

2

Просто быстрый бросок-офф - почему не писать внутренний запрос в качестве простой таблицы с

CASE WHEN alternaterating = 'PARTICLE' THEN 1 ELSE 0 

затем запрос к этой таблице?

Смежные вопросы