MariaDB сравнивая счетчик чисел из двух таблиц

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

Если SalesID Всего COUNT в total_sales стол выше чем fid Всего COUNT в total_leads таблица, то я хотел бы вывести эти значения.

Таблицы:

CREATE TABLE total_leads
    (`uid` int, `tstamp` int, `fid` int, `phone` varchar(2))
;

INSERT INTO total_leads
    (`uid`, `tstamp`, `fid`, `phone`)
VALUES
    (1, 1299795364, 1525, '""'),
    (1, 1309854563, 4031, '""'),
    (1, 1309854562, 3134, '""'),
    (5, 1280752536, 18, '""'),
    (5, 1280942244, 219, '""'),    
    (5, 1309862562, 1234, '""'),
    (5, 1480752536, 184, '""'),
    (5, 1520942244, 119, '""')
;

CREATE TABLE total_sales
    (`UserID` int, `SalesID` int, `Time` varchar(8))
;

INSERT INTO total_sales
    (`UserID`, `SalesID`, `Time`)
VALUES
    (1, 172, '12:57:43'),
    (1, 3563, '15:59:49'),
    (1, 9508, '01:46:47'),
    (5, 18935, '07:26:07'),
    (5, 19378, '08:06:41'),
    (1, 144, '11:52:41'),
    (1, 9248, '02:43:40'),
    (1, 3423, '14:54:45'),
    (5, 11935, '03:21:06'),
    (1, 1448, '05:02:24')
;

Команды MySQL:

SELECT x.uid, COUNT(*), COUNT(DISTINCT x.fid)
FROM total_leads AS x
WHERE x.uid BETWEEN 1 AND 5
GROUP BY x.uid;

SELECT ud.UserId, COUNT(*), COUNT(DISTINCT ud.SalesID)
FROM total_sales AS ud
WHERE ud.UserId BETWEEN 1 AND 5  
GROUP BY ud.UserID;

Возвращает (total_leads, total_sales):

 uid    COUNT(*)    COUNT(DISTINCT x.fid)
  1        3               3
  5        5               5

UserId  COUNT(*)    COUNT(DISTINCT ud.SalesID)
  1        7               7
  5        3               3

Поэтому я надеюсь получить такой результат, как:

UserId   Sales           Leads   Dif
  1        7               3      4

Даже просто зная, какие именно UserID имеет Sales > fid было бы тоже прекрасно

UserId  COUNT(*)    COUNT(DISTINCT ud.SalesID)
  1        7               7

Онлайн пример.

Я пробовал несколько вещей, таких как UNION, но это просто объединило все значения вместе.

3 ответа

Решение

Использовать соединение подзапроса

select uid,leadcount,salescount,salescount-leadcount as diff from 
(
SELECT x.uid, COUNT(*) leadcount, COUNT(DISTINCT x.fid)
FROM total_leads AS x
WHERE x.uid BETWEEN 1 AND 5
GROUP BY x.uid
) t1 left join 
(
SELECT ud.UserId, COUNT(*) salescount, COUNT(DISTINCT ud.SalesID)
FROM total_sales AS ud
WHERE ud.UserId BETWEEN 1 AND 5  
GROUP BY ud.UserID
) t2 on t1.uid=t2.UserId

Попробуйте этот код,

 SELECT x.uid,COUNT(DISTINCT x.fid) AS leads,COUNT(DISTINCT ud.SalesID) AS 
 sales,((COUNT(DISTINCT ud.SalesID))-(COUNT(DISTINCT x.fid)))
 FROM
 total_leads AS X,total_sales AS ud WHERE x.uid=ud.UserId AND ud.UserId BETWEEN 1 AND 5 
 GROUP BY ud.UserID;

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

select t1.uid,t2.sales_count,t1.leads_count,
      case when t1.leads_count > t2.sales_count then t1.leads_count -t2.sales_count 
           else t2.sales_count -t1.leads_count
      end as diff
from 
(
select uid,count(fid) as leads_count
from total_leads
group by uid
)t1
inner join 
(
select UserID,count(SalesID)as sales_count
from total_sales
group by UserID
)t2 on t1.uid = t2.userid ;
Другие вопросы по тегам