2013-04-08 4 views
0

Возможно ли иметь несколько HAVING в одном запросе?Предложение HAVING в одном запросе с подзапросом

Вот мой пример запроса:

SELECT household_tbl.household_connector_id AS h_id 
    , (
     SELECT COUNT(household_connector_id) 
     FROM household_tbl 
     WHERE household_connector_id = h_id 
      AND hh_phic_status = 1 
      AND age >= 21 
      AND age_category = "Year" 
     ) + (
     SELECT COUNT(hh_members_connector_id) 
     FROM tbl_household_members 
     WHERE household_connector_id = h_id 
      AND hh_phic_status = 1 
      AND hh_age >= 21 
      AND hh_age_category = "Year" 
     ) AS total_phic 
    , (
     SELECT COUNT(household_connector_id) 
     FROM household_tbl 
     WHERE household_connector_id = h_id 
      AND hh_phic_status = 1 
      AND age >= 21 
      AND age_category = "Year" 
      AND (
       hh_phic_membership_category = "ng sponsored" 
       OR hh_phic_membership_category = "Sponsored-NG(DOH)" 
       ) 
     ) + (
     SELECT COUNT(hh_members_connector_id) 
     FROM tbl_household_members 
     WHERE household_connector_id = h_id 
      AND hh_phic_status = 1 
      AND hh_age >= 21 
      AND hh_age_category = "Year" 
      AND (
       hh_phic_membership_category = "ng sponsored" 
       OR hh_phic_membership_category = "Sponsored-NG(DOH)" 
       ) 
     ) AS ng_sponsored 
FROM household_tbl 
WHERE barangay = "'.$barangay.'" 
HAVING total_phic <> 0 

Я хочу иметь также "HAVING ng_sponsored <> 0"

Спасибо!

+0

Как насчет добавление 'where clause' вместо' HAVING'? – TechDo

+0

попробуйте это. Total_phic <> 0 и ng_sponsored <> 0 –

+0

hello kabayan ':)' можете указать структуру таблицы и сообщить нам, что вы пытаетесь сделать? Поздравляем вас с окончанием обучения. –

ответ

-1

ли это:

  Select * From 
      (
       SELECT household_tbl.household_connector_id as h_id, 
         (SELECT COUNT(household_connector_id) 
         FROM household_tbl 
         WHERE household_connector_id = h_id 
         AND hh_phic_status = 1 
         AND age >= 21 
         AND age_category = "Year") + 

        (SELECT COUNT(hh_members_connector_id) 
        FROM tbl_household_members 
        WHERE 
        household_connector_id = h_id 
        AND hh_phic_status = 1 
        AND hh_age >= 21 
        AND hh_age_category = "Year") 
        as total_phic, 


        (SELECT COUNT(household_connector_id) 
        FROM household_tbl 
        WHERE household_connector_id = h_id 
        AND hh_phic_status = 1 
        AND age >= 21 
        AND age_category = "Year" 
        AND (hh_phic_membership_category = "ng sponsored" OR hh_phic_membership_category = "Sponsored-NG(DOH)")) + 

        (SELECT COUNT(hh_members_connector_id) 
        FROM tbl_household_members 
        WHERE household_connector_id = h_id 
        AND hh_phic_status = 1 
        AND hh_age >= 21 
        AND hh_age_category = "Year" 
        AND (hh_phic_membership_category = "ng sponsored" OR hh_phic_membership_category = "Sponsored-NG(DOH)")) 
        as ng_sponsored 
        FROM household_tbl WHERE barangay = "'.$barangay.'" 
       )tbl Group By h_id,total_phic,ng_sponsored 
       HAVING total_phic <> 0 

Вы можете заменить:

Group By h_id,total_phic,ng_sponsored HAVING total_phic <> 0 

По

Where total_phic <> 0 
+0

Спасибо за помощь. Я уже получил ответ :) –

0

Вы можете рассчитать каждый count, который удовлетворяет условию подзапроса. Оператор фильтрации, который здесь нужен, - это только WHERE, а не HAVING, потому что у вас больше нет агрегирования внешнего запроса.

SELECT a.household_connector_id AS h_id, 
     COALESCE(b.totalCount, 0) + COALESCE(c.totalCount, 0) AS total_phic, 
     COALESCE(b.totalCountSponsored, 0) + COALESCE(c.totalCountSponsored, 0) AS ng_sponsored 
FROM household_tbl a 
     INNER JOIN 
     (
      SELECT household_connector_id, 
        COUNT(*) totalCount, 
        SUM(hh_phic_membership_category IN ('ng sponsored', 'Sponsored-NG(DOH)')) totalCountSponsored 
      FROM household_tbl 
      WHERE hh_phic_status = 1 AND 
        age >= 21 AND 
        age_category = "Year" 
      GROUP BY household_connector_id   
     ) b ON a.household_connector_id = b.household_connector_id 
     LEFT JOIN 
     (
      SELECT household_connector_id, 
        COUNT(*) totalCount, 
        SUM(hh_phic_membership_category IN ('ng sponsored', 'Sponsored-NG(DOH)')) totalCountSponsored 
      FROM tbl_household_members 
      WHERE hh_phic_status = 1 AND 
        hh_age >= 21 AND 
        hh_age_category = "Year" 
      GROUP BY household_connector_id 
     ) c ON a.household_connector_id = c.household_connector_id 
WHERE a.barangay = "barangay_value_HERE" AND 
     COALESCE(b.totalCount, 0) + COALESCE(c.totalCount, 0) <> 0 AND 
     COALESCE(b.totalCountSponsored, 0) + COALESCE(c.totalCountSponsored, 0) <> 0 

Вы не можете также использовать ALIAS на пункте WHERE, который создается на том же уровне, потому что ALIAS были созданы на SELECT пункта и WHERE пункт выполняется перед SELECT. Вот полный SQL Порядок работы,

  • ЕКОМ
  • ИНЕКЕ
  • GROUP BY п
  • предложения HAVING
  • ВЫБРАТЬ пункт
  • ORDER BY п
+0

Спасибо, что помогли. Я уже получил ответ :) –

+0

рад это слышать. вы реструктурировали запрос? –

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