Двойной счет в одном запросе SQL - PullRequest
0 голосов
/ 05 марта 2020

Я бы хотел, чтобы оба СЧЕТА были в одном запросе, что является лучшим способом? Я хочу рассчитывать как продажи, так и оба потенциальных клиента на основе status_id

SELECT COUNT(status_id) as Leads FROM activities WHERE YEARWEEK(`date`, 1) = YEARWEEK(CURDATE(), 1) AND status_id =5
SELECT COUNT(status_id) as Sales FROM activities WHERE YEARWEEK(`date`, 1) = YEARWEEK(CURDATE(), 1) AND status_id =4

Ответы [ 4 ]

4 голосов
/ 05 марта 2020

Я предполагаю, что вы захотите разделить эти два элемента, поэтому добавьте status_id в свой список SELECT, а затем GROUP.

SELECT status_id, COUNT(status_id) as Leads 
FROM activities 
WHERE YEARWEEK(`date`, 1) = YEARWEEK(CURDATE(), 1) 
AND status_id IN (4,5)
GROUP BY status_id;

Редактировать на основе комментариев:

Я хочу, чтобы один счетчик выбрал status_id как Leads, а другой - как Sales.

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

SELECT
  SUM(CASE WHEN status_id = 4 THEN 1 ELSE 0 END) AS Leads,
  SUM(CASE WHEN status_id = 5 THEN 1 ELSE 0 END) AS Sales
FROM activities 
WHERE YEARWEEK(`date`, 1) = YEARWEEK(CURDATE(), 1) 
AND status_id IN (4,5)
GROUP BY status_id;
2 голосов
/ 05 марта 2020

Не используйте Счет использовать сумму Как это

Для более подробного объяснения. COUNT без Group BY всегда дает результат всех строк в моем примере 5 как для SELECT Count (status_id = 5), так и Count (status_id = 4).

Поскольку я этого не делаю используйте GROUP BY в моем правильном ответе, SUM является единственным решением

CREATE TaBLE activities
(status_id Integer,
`date` Date
);
INSERT INTO activities
VALUES (4,now()),(4,now()),(4,now()),(5,now()),(5,now());
SELECT SUM(IF(status_id= 5,1,0)) as Leads , SUM(IF(status_id= 4,1,0)) as SALES 
FROM activities 
WHERE YEARWEEK(`date`, 1) = YEARWEEK(CURDATE(), 1) 
Leads | SALES
----: | ----:
    2 |     3

дБ <> скрипка здесь

0 голосов
/ 05 марта 2020

Вы можете сделать что-то вроде этого:

SELECT status_id,
       SUM(Case when Status_id=5 then 1 else 0 end) as Leads,
       SUM(Case when Status_id=4 then 1 else 0 end) as Sales
FROM activities 
WHERE YEARWEEK(`date`, 1) = YEARWEEK(CURDATE(), 1) 
      AND status_id IN (4,5)
GROUP BY status_id;

Это даст вам поля для буксировки с лидами и значениями продаж. Надеюсь, это поможет.

0 голосов
/ 05 марта 2020
 SELECT status_id, CASE when status_id = 5 then 'Leads' else 'Sales' end as ColName,
COUNT(status_id) as ColCount
FROM activities
WHERE YEARWEEK(`date`, 1) = YEARWEEK(CURDATE(), 1)
  AND status_id in (5, 4)
group by status_id
...