2013-12-16 3 views
1

Я использую SQLite, и я довольно новичок в SQL в целом. У меня возникла проблема с запросом, при котором мои новые операторы COUNT возвращают одинаковые номера, когда их не должно быть. Когда я запускаю два подзадача отдельно, я получаю правильные результаты, поэтому я знаю, что я просто заполняю их вместе. Любые предложения о том, как сделать это менее уродливым, также очень ценятся!Множество COUNT в запросе, возвращающем неверные результаты

Я использую следующий очень некрасиво оператор выбора:

SELECT BATCH_ID, PROGRAM_ID, 
    COUNT((SELECT ID FROM PARTS 
      WHERE DROPSHIP_ONLY = 'No' 
      AND OBSOLETE = 'No' 
      AND DISCONTINUED = 'No')) 
      AS 'Active Parts', 
    COUNT((SELECT ID FROM PARTS 
      WHERE DROPSHIP_ONLY = 'No' 
      AND OBSOLETE = 'No' 
      AND DISCONTINUED = 'No' 
      AND ON_HAND > 0 
      AND ON_HAND > SAMPLE_LEVEL)) 
      AS 'Instock Parts' 
      FROM PARTS 
      GROUP BY BATCH_ID, PROGRAM_ID; 

Он возвращает это:

BATCH_ID PROGRAM_ID Active Parts Instock Parts 
201311 Vendor1 1390   1390 
201311 Vendor2 1433   1433 
201311 Vendor3 213   213 
201311 Vendor4 3595   3595 
201311 Vendor5 98   98 
201311 Vendor6 3   3 

Ожидаемый результат для активных частей:

201311 Vendor1 1144 
201311 Vendor2 1380 
201311 Vendor3 100 
201311 Vendor4 2276 
201311 Vendor5 98 
201311 Vendor6 3 

Ожидаемый результат для Запасные части:

201311 Vendor1 15 
201311 Vendor2 1272 
201311 Vendor3 45 
201311 Vendor4 1767 
201311 Vendor5 97 
201311 Vendor6 3 

Спасибо за любую помощь или предложения!

ответ

1

Попробуйте его с помощью CASE()

SELECT BATCH_ID, 
     PROGRAM_ID, 
     SUM(CASE WHEN DROPSHIP_ONLY = 'No' 
         AND OBSOLETE = 'No' 
         AND DISCONTINUED = 'No' 
       THEN 1 END) AS 'Active Parts', 
     SUM(CASE WHEN DROPSHIP_ONLY = 'No' 
         AND OBSOLETE = 'No' 
         AND DISCONTINUED = 'No' 
         AND ON_HAND > 0 
         AND ON_HAND > SAMPLE_LEVEL 
       THEN 1 END) AS 'Instock Parts' 
FROM PARTS 
WHERE DROPSHIP_ONLY = 'No' 
     AND OBSOLETE = 'No' 
     AND 
     (
      (DISCONTINUED = 'No') 
      OR 
      (DISCONTINUED = 'No' 
      AND ON_HAND > 0 
      AND ON_HAND > SAMPLE_LEVEL) 
     ) 
GROUP BY BATCH_ID, PROGRAM_ID 
+0

Святого человека, который был быстро. Похоже, что он работает правильно! Не могли бы вы объяснить гнездо AND после предложения WHERE, а именно, почему ему нужно DROPSHIP_ONLY = 'Нет', вложенное в это предложение AND, когда оно уже указано в начале предложения WHERE? Спасибо! – Methonis

+0

это была опечатка. это должно быть 'DISCONTINUED = 'No''. –

+0

Хорошо, спасибо за разъяснение! – Methonis

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