2015-05-14 2 views
0

У меня есть 2 таблицы.Как я могу подсчитать одинаковые строки в sql

Таблица сделка:

id | customer_id | department_id 
-------------------------------- 
1 |  1  |  2 
-------------------------------- 
2 |  2  |  3 
-------------------------------- 
3 |  2  |  4 
-------------------------------- 
4 |  3  |  1 
-------------------------------- 
5 |  2  |  3 
-------------------------------- 

Таблица des_department

id | caption 
----------------- 
1 | department1 
----------------- 
2 | department2 
----------------- 
3 | department3 
----------------- 
4 | department4 
----------------- 
5 | department5 
----------------- 

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

Пример вывода:

customer_id |  caption 
    ------------------------------ 
      1  |  department2 
    ------------------------------ 
      2  |  department3 
    ------------------------------ 
      3  |  department1 
    ------------------------------ 

У меня есть также собственный запрос. Но я показываю число всех посещений.

Мой запрос:

SELECT t.customer_id, t.terminal_i 
    FROM transaction t WHERE (t.customer_id, t.terminal_id) IN 
    (SELECT t1.customer_id, t1.terminal_id 
    FROM transaction t1 GROUP BY t1.customer_id 
) 

Я работаю на dbForge для Mysql.

+0

возможно дубликат [SQL выбрать только строки с максимальным значением на колонке] (http://stackoverflow.com/questions/7745609/sql-select-only-rows-with- max-value-on-a-column) – sevenforce

+0

@sevenforce Ваша ссылка о отображении только макс строк. В моем примере мне нужно подсчитывать для каждого пользователя его посещаемый отдел и показывать, в каких случаях пользователь посещает больше, чем другие. –

ответ

0

Я пишу этот запрос, исследуя в Интернете, и может быть, это будет полезно для кого-то. Вот SQL-код:

SELECT customer_id, dd.caption 
    FROM 
    (SELECT t.customer_id, t.deparment_id 
    FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.deparment_id) AS ter 
     FROM transaction t 
     GROUP BY t.customer_id, t.deparment_id) t 
    WHERE NOT EXISTS (SELECT 1 
        FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.deparment_id) AS ter 
          FROM transaction t 
          GROUP BY t.customer_id, t.deparment_id) td 
          WHERE td.customer_id = t.customer_id AND td.ter>t.ter 
         )) 
    tx 
    INNER JOIN des_department dd 
    ON tx.deparment_id = dd.id 
1

Этот тип запроса излишне громоздкий в MySQL (поскольку MySQL не поддерживает ни общие табличные выражения, ни функции окна).

Один из подходов состоит в том, чтобы агрегировать таблицу дважды, один раз, чтобы получить счет на одного клиента/отдела. Второй раз, чтобы получить максимум за клиента. Затем присоедините это к таблице, агрегированной клиентом и отделом, чтобы получить максимальную ценность отдела.

SELECT t.customer_id, d.caption 
FROM (SELECT td.customer_id, MAX(cnt) as maxcnt 
     FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.terminal_id) as cnt 
      FROM transaction t 
      GROUP BY t.customer_id, t.department_id 
      ) td 
     GROUP BY t.customer_id 
    ) tt JOIN 
    (SELECT t.customer_id, t.deparment_id, COUNT(t.terminal_id) as cnt 
     FROM transaction t 
     GROUP BY t.customer_id, t.deparment_id 
    ) td 
    ON t.customer_id = tt.customer_id and td.cnt = tt.cnt JOIN 
    des_department d 
    ON td.department_id = d.id 
+0

Извините, я смутил вас. terminal_id - это то же самое, что и department_id. Я объяснял только другим словом. Я также исправляю в своем примере, может ли вы исправить свой ответ. –

Смежные вопросы