Как правильно использовать оператор GROUP BY в SQL? - PullRequest
4 голосов
/ 27 марта 2019

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

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.Я попытался сделать подгруппу, однако, я получил ошибку, потому что будет более 1 строки для каждого магазина.Мне нужно, чтобы запрос вычислял конвертированное преимущество каждого магазина, которое выглядит примерно так:

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

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

Ответы [ 3 ]

2 голосов
/ 27 марта 2019

Вы не коррелируете подзапрос с названием магазина. Хотя это можно сделать в предложении 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;
2 голосов
/ 27 марта 2019

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

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;
0 голосов
/ 27 марта 2019

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...