mysql GROUP BY для отображения всех соответствующих полей

0

Моя таблица выглядит следующим образом:

ID      EMP_ID      NAME        ACTIVITY_DATE       ACTIVITY_CODE

1       EMP01      ROCKY        2018-02-19          AC04  
2       EMP02      SMITH        2018-02-19          AC09
3       EMP02      SMITH        2018-02-19          AC10
4       EMP01      ROCKY        2018-02-20          AC04
5       EMP01      ROCKY        2018-02-20          AC04
6       EMP03      RICKY        2018-02-22          AC05
7       EMP03      RICKY        2018-02-22          AC07
8       EMP02      SMITH        2018-02-22          AC09

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

ID      EMP_ID      NAME        ACTIVITY_DATE    ACTIVITY_CODE     COUNT

1       EMP01      ROCKY        2018-02-19          AC04            3
4       EMP01      ROCKY        2018-02-20          AC04            2
6       EMP03      RICKY        2018-02-22          AC05            3

Я пробовал этот запрос:

SELECT ID, EMP_ID, NAME, ACTIVITY_DATE, ACTIVITY_CODE 
FROM emp_entries
GROUP BY ID, EMP_ID, NAME, ACTIVITY_DATE, ACTIVITY_CODE

Но это не исключает дублирование записей.

Его работа только в том случае, если я это сделаю:

SELECT COUNT(ACTIVITY_DATE), ACTIVITY_DATE 
FROM emp_entries
GROUP BY ACTIVITY_DATE. 

но он показывает только одно поле.

Теги:

4 ответа

1
Лучший ответ
Use inner join and subquery:

select e1.ID ,e1.EMP_ID ,e1.NAME,e1.ACTIVITY_DATE,e1.ACTIVITY_CODE,e2.count 
from emp_entries e1 inner join
(
SELECT COUNT(ACTIVITY_DATE) as count, ACTIVITY_DATE, min(id) as mid
FROM emp_entries
GROUP BY ACTIVITY_DATE
) e2 on e1.id=e2.mid
  • 1
    @RaymondNijland, group by находится внутри подзапроса - SELECT COUNT (ACTIVITY_DATE) в качестве счетчика, ACTIVITY_DATE, min (id) в середине FROM emp_entries GROUP BY ACTIVITY_DATE
  • 1
    Не берите в голову .. я прочитал это неправильно из-за форматирования .. Боже, мне нужно немного кофе, чтобы проснуться.
Показать ещё 1 комментарий
1

Вы можете использовать subquery и join к нему

   SELECT e1.id,e1.EMP_ID,e1.NAME,e1.ACTIVITY_DATE ,e1.ACTIVITY_CODE,e2.cnt 
    FROM emp_entries e1
    JOIN(
        SELECT COUNT(ACTIVITY_DATE) as cnt,MIN(id) AS mId
        FROM emp_entries
        GROUP BY ACTIVITY_DATE) e2 
    ON e2.mId=e1.id
0

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

SELECT 
    MIN(ID) as ID,
    MIN(EMP_ID) as EMP_ID,
    MIN(NAME) as NAME,
    ACTIVITY_DATE, 
    MIN(ACTIVITY_CODE) as ACTIVITY_CODE,
    COUNT(ID) as COUNT
FROM emp_entries
GROUP BY ACTIVITY_DATE
0

Для устранения дубликатов вам нужно использовать ключевое слово Distinct.

Выберите Distinct col1, col 2 и т.д.

  • 1
    Это не работает здесь, так как идентификаторы разные.
  • 0
    это не будет работать здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню