Как правильно использовать оператор GROUP BY в SQL?

#mysql #sql

#mysql #sql

Вопрос:

Мне нужно запустить запрос к базе данных потенциальных клиентов, в котором необходимо указать название магазина, общее количество потенциальных клиентов для этого магазина и общее количество преобразованных потенциальных клиентов. Пока что ниже приведено то, что я получил:

 SELECT  stores.store_name as Store, COUNT(*) as "Total Lead", 
        (SELECT COUNT(*) as "Converted Lead" FROM leads WHERE lead_status_id = 5) 
FROM "leads" 
INNER JOIN "employee_leads" ON "employee_leads"."lead_id" = "leads"."id" 
INNER JOIN "employees" ON "employees"."id" = "employee_leads"."employee_id" 
INNER JOIN "emp_stores" ON "emp_stores"."employee_id" = "employees"."id" 
INNER JOIN "stores" ON "stores"."id" = "emp_stores"."store_id" 
GROUP BY store_name;
  

Однако это неправильно, потому что преобразованная часть вычисляла все преобразованные запросы, а не по определенному хранилищу. Результат, который я получил, приведен ниже:

   ------------ ------------- ---------------- 
 | Store      | Total Lead  | Converted Lead |
  ------------ ------------- ---------------- 
 | Store1     |         10  |            10  |
 | Store2     |         14  |            10  |
 | Store3     |         17  |            10  |
  ------------ ------------- ---------------- 
  

В столбце «Преобразованный интерес» в настоящее время указано общее количество преобразованных интересов во всех магазинах. Столбец «Преобразованный интерес», предположительно, равен 4 для Store1, 3 для Store2 и 4 для Store3. Я попытался выполнить подгруппу by, однако я получил ошибку, потому что для каждого хранилища будет более 1 строки. Мне нужен запрос, вычисляющий преобразованный интерес каждого магазина, который выглядит примерно так, как показано ниже:

   ------------ ------------- ---------------- 
 | Store      | Total Lead  | Converted Lead |
  ------------ ------------- ---------------- 
 | Store1     |         10  |             4  |
 | Store2     |         14  |             3  |
 | Store3     |         17  |             4  |
  ------------ ------------- ---------------- 
  

Может кто-нибудь указать мне правильное направление? Спасибо

Ответ №1:

Вы можете попробовать использовать агрегатную функцию condition вместо подзапроса.

 SELECT  stores.store_name as Store, COUNT(*) as "Total Lead", 
        COUNT(CASE WHEN lead_status_id = 5 THEN 1 END) "Converted Lead" 
FROM "leads" 
INNER JOIN "employee_leads" ON "employee_leads"."lead_id" = "leads"."id" 
INNER JOIN "employees" ON "employees"."id" = "employee_leads"."employee_id" 
INNER JOIN "emp_stores" ON "emp_stores"."employee_id" = "employees"."id" 
INNER JOIN "stores" ON "stores"."id" = "emp_stores"."store_id" 
GROUP BY store_name;
  

если вы используете mysql, вы можете попробовать использовать COUNT(lead_status_id = 5)

 SELECT  stores.store_name as Store, COUNT(*) as "Total Lead", 
        COUNT(lead_status_id = 5) "Converted Lead" 
FROM "leads" 
INNER JOIN "employee_leads" ON "employee_leads"."lead_id" = "leads"."id" 
INNER JOIN "employees" ON "employees"."id" = "employee_leads"."employee_id" 
INNER JOIN "emp_stores" ON "emp_stores"."employee_id" = "employees"."id" 
INNER JOIN "stores" ON "stores"."id" = "emp_stores"."store_id" 
GROUP BY store_name;
  

Ответ №2:

Вы не соотносите подзапрос с названием хранилища. Хотя это можно было бы сделать в его where предложении, и более простым подходом было бы подсчитать case выражение, чтобы подсчитывать только лиды с соответствующим статусом:

 SELECT  stores.store_name as Store, 
        COUNT(*) as "Total Lead", 
        COUNT(CASE lead_status_id WHEN 5 THEN 1 END) AS "Converted Lead"
FROM "leads" 
INNER JOIN "employee_leads" ON "employee_leads"."lead_id" = "leads"."id" 
INNER JOIN "employees" ON "employees"."id" = "employee_leads"."employee_id" 
INNER JOIN "emp_stores" ON "emp_stores"."employee_id" = "employees"."id" 
INNER JOIN "stores" ON "stores"."id" = "emp_stores"."store_id" 
GROUP BY store_name;
  

Ответ №3:

Пожалуйста, попробуйте это.

 SELECT  stores.store_name as Store, COUNT(*) as "Total Lead", 
        (SELECT COUNT(*) as "Converted Lead" FROM leads AS SS WHERE SS.id =A.id AND lead_status_id = 5) 
FROM "leads" AS A 
INNER JOIN "employee_leads" ON "employee_leads"."lead_id" = "A"."id" 
INNER JOIN "employees" ON "employees"."id" = "employee_leads"."employee_id" 
INNER JOIN "emp_stores" ON "emp_stores"."employee_id" = "employees"."id" 
INNER JOIN "stores" ON "stores"."id" = "emp_stores"."store_id" 
GROUP BY store_name;