2016-04-28 5 views
0

Я начинаю с этого запроса, который возвращает мне 8 записей с «заявленным» статусом. Я ищу, чтобы увидеть, если любой из адресов в invites-from-address колонки отличается от такового в moves-from-address колонки:Как подсчитать результаты предложения where, чтобы рассчитать пропорцию предложения MYSQL select?

SELECT i.id, i.company_id, i.status, 
    ia_f.base_street as "invites-from-address", a_f.base_street as "moves-from-address", 
    ia_t.base_street as "invites-to-address", a_t.base_street as "moves-to-address", i.`mover_first_name`, 
    i.mover_last_name, i.`to_address_id` 

FROM invites i 
JOIN moves m ON i.id = m.`claimed_invite_id` 
JOIN `invite_addresses` ia_f ON ia_f.id = i.`from_address_id` 
JOIN addresses a_f ON a_f.id = m.from_address_id 

JOIN `invite_addresses` ia_t ON ia_t.id = i.to_address_id 
JOIN addresses a_t ON a_t.id = m.to_address_id 

WHERE i.`company_id` = 1040345 
GROUP BY id 

То, что я пытаюсь сделать в этом запросе ниже, чтобы создать average_discrepancy колонки на который показывает долю адресов, которые отличаются от invites-from-address и moves-from-address. Я был в состоянии успешно проверить адреса неточностей с помощью пункта WHERE, который проверяет, что ia_f.base_street не равна a_f.base_street (которые псевдонимы столбцов invites-from-address и moves-from-address соответственно), но когда я ставлю эту WHERE положения внутри функций count в моих SELECT причинах он не работает. Это потому, что я не могу разместить WHERE в рамках функции SELECT или count или обоих? И есть ли также проблема с попыткой разделить результаты двух вызовов функции count в моем предложении SELECT?

SELECT i.id, i.company_id, i.status, 
    count(WHERE ia_f.base_street != a_f.base_street)/count(i.status="claimed") as "average_discrepancy", 
    ia_f.base_street as "invites-from-address", a_f.base_street as "moves-from-address", 
    ia_t.base_street as "invites-to-address", a_t.base_street as "moves-to-address", 
    i.`mover_first_name`, 
    i.mover_last_name, i.`to_address_id` 

FROM invites i 
JOIN moves m ON i.id = m.`claimed_invite_id` 
JOIN `invite_addresses` ia_f ON ia_f.id = i.`from_address_id` 
JOIN addresses a_f ON a_f.id = m.from_address_id 

JOIN `invite_addresses` ia_t ON ia_t.id = i.to_address_id 
JOIN addresses a_t ON a_t.id = m.to_address_id 

WHERE i.`company_id` = 1040345 

AND i.status = "claimed" 

ответ

1

Вы должны поместить это в SUM вместо COUNT. Что-то вроде этого будет делать трюк:

SELECT i.id, i.company_id, i.status, 
    SUM(CASE WHEN ia_f.base_street != a_f.base_street THEN 1 ELSE 0 END)/ SUM(CASE WHEN i.status='claimed' THEN 1 ELSE 0 END) as 'average_discrepancy', 
    ia_f.base_street as 'invites-from-address', 
    a_f.base_street as 'moves-from-address', 
    ia_t.base_street as 'invites-to-address', 
    a_t.base_street as 'moves-to-address', 
    i.mover_first_name, 
    i.mover_last_name, 
    i.to_address_id 

FROM invites i 
JOIN moves m ON i.id = m.claimed_invite_id 
JOIN invite_addresses ia_f ON ia_f.id = i.from_address_id 
JOIN addresses a_f ON a_f.id = m.from_address_id 

JOIN invite_addresses ia_t ON ia_t.id = i.to_address_id 
JOIN addresses a_t ON a_t.id = m.to_address_id 

WHERE i.company_id = 1040345 

AND i.status = 'claimed' 
+0

Это было! Последующий вопрос, если я хочу показать только записи, у которых есть несоответствие адресов, какую статью я должен использовать? Есть ли способ построить это условие для реализации этого желаемого результата? – phizzy

+0

Вы можете обернуть это внутри другого оператора SELECT, чтобы вытащить только те записи, которые вы хотите показать. Проблема с изменением этого запроса, чтобы показать только те записи, состоит в том, что ваши операции SUM будут меняться, если мы изменим результат запроса. Если это были завернуты в другой запрос, это будет выглядеть примерно так: «SELECT sub.id, sub.company_id, sub.status, sub.average_discrepancy, sub.invites_from_address, moves_from_address, moves_to_address, sub.mover_first_name , sub.mover_last_name, sub.to_address_id ОТ \t! (- Оригинальный запрос здесь идет) свеженький WHERE sub.base_street = sub_f.base – ghg565

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