2015-09-02 6 views
3

У меня есть таблица вроде этого:Граф количество результатов для повторяющихся строк SQL

customer   employee 
------  --------- 
    A    Adam 
    A    Adam 
    A    Adam 
    B    Bob 
    C    Adam 
    C    Adam 
    B    Bob 
    D    Dan 

Я пытаюсь выяснить, как показать, сколько раз Адам имел постоянных клиентов и сколько раз Боб , Таким образом, в приведенном выше примере было бы вернуть:

Адам => 2 (у него было 2 постоянных клиентов, клиент A и C)

Боб => 1 (он был 1 повторный клиент, клиент б)

Dan => 0 (он был только один клиент, не повторы)

То, что я до сих пор является:

SELECT customer, COUNT(*) as cnt 
FROM table 
GROUP BY employee 
HAVING cnt > 1 

Но я просто не могу показаться, чтобы получить остальную часть т он способ.

+0

Ваш SQL также обеспечить правильный результат.вы можете протестировать этот SQL ==> SELECT id, customer, employee, COUNT (*) FROM USER GROUP У сотрудника HAVING COUNT (*)> 0 – matinict

ответ

2

Прежде всего, вам нужно найти клиента-повторителя:

SELECT employee,customer FROM yourtable GROUP BY employee, customer having COUNT(*) > 1; 

После того, что вы можете найти, сколько повторных клиентов была каждый сотрудник:

SELECT employee, COUNT(*) from (
SELECT employee,customer 
    FROM yourtable 
    GROUP BY employee, customer 
    HAVING COUNT(*) > 1 
) t 
GROUP BY employee; 
-1

ВЫБРАТЬ клиент, сотрудник FROM таблицы GROUP BY клиента, сотрудник HAVING COUNT (*)> 1

0
select employee, count(*)-1 as cnt 
from t1 
group by employee,customer 
having cnt > 0; 
+0

Хотя это может быть хорошим ответом, пожалуйста, подумайте над тем, чтобы добавить еще несколько объяснений о том, почему это правильное решение и то, что именно вы делаете :) –

+0

Группировка сотрудника и клиента при повторном вхождении одной и той же пары сотрудников и клиентов будет считаться повторным клиентом для сотрудника. Также, поскольку мы подсчитываем повторные посещения, поэтому первый из них не будет считаться, следовательно, счет (*) - 1 –

3

Вы можете попробовать ниже запрос:

SELECT 
    t.employee, COUNT(*) AS cnt 
FROM 
    (SELECT 
     employee, customer, COUNT(*) AS actcnt 
    FROM 
     customers 
    GROUP BY customer , employee HAVING actcnt > 1) AS t 
GROUP BY t.employee 
ORDER BY t.employee; 

DEMO

+0

Это похоже на трюк. Но я не совсем понимаю некоторые вещи. Есть ли причина для t перед сотрудником (t.employee)? Также, где будет отображаться идентификатор таблицы? – Robbie

+1

@Robbie t является результатом INNER QUERY –

+0

Идентификатор таблицы будет закрыт после возвращения результата в внешний запрос, который теперь «t» будет работать как идентификатор –

0

Если вы COUNT повтора сотрудника:

SELECT id,customer,employee,COUNT(*) FROM USER GROUP BY employee HAVING COUNT(*)>0 

enter image description here

Если вы COUNT повтора клиента:

SELECT id,customer,employee,COUNT(*) FROM USER GROUP BY customer HAVING COUNT(*)>0 

enter image description here

// Примечание: я беру общее количество, вы меняете) COUNT ()> 0 для COUNT ()> 1 & Таблица & = пользователь, как

CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `customer` varchar(200) DEFAULT NULL, 
    `employee` varchar(200) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1; 

/* Данные для таблицы user */

insert into `user`(`id`,`customer`,`employee`) 
values (1,'A','Adam'),(2,'A','Adam'),(3,'A','Adam'),(4,'B','Bob'),(5,'C','Adam'),(6,'C','Adam'),(7,'B','Bob'),(8,'D','Dan'); 
Смежные вопросы