выбрать несколько столбцов, считать один столбец и группировать по одному столбцу в одной таблице - PullRequest
0 голосов
/ 02 июня 2018

У меня есть таблица с именем [delivery], со столбцами [ID],[Employee],[Post],[c_name],[Deli_Date],[note]

Мне нужно выбрать все столбцы и сосчитать Employee, а затем сгруппировать по Employee.данные в таблице примерно так:

  ---------------------------------------------------
  | Employee| Post      |c_name  |Deli_Date   |Note |
  |---------|-----------|---------------------|-----|
  |  DAVID  |MANAGER    | a      |11/11/2018  |note |
  |  DAVID  |MANAGER    | b      |01/01/2015  |note |
  |  SAM    |ACOUNTS    | c      |10/10/2016  |note |
  |  DAVID  |IT         | a      |10/02/2015  |note |
  |  DAVID  |DOCTOR     | c      |20/02/2017  |note |
  |  JAMES  |DELIVERYMAN| b      |05/05/2015  |note |
  |  OLIVER |DRIVER     | b      |02/02/2014  |note |
  |  SAM    |ACOUNTS    | c      |02/02/2012  |note |

этот код:

select Employee, count(Employee) as TIMES from delivery
group by Employee

результат: (но мне нужно показать и другие столбцы).

| Employee| TIMES | 
|---------|-------|
|  DAVID  |   4   |
|  JAMES  |   1   |
|  OLIVER |   1   |
|  SAM    |   2   |

Мне нужно, чтобы мой код показывался следующим образом:

| Employee| TIMES | Post      |c_name  |Deli_Date   |Note |
|---------|-------|-----------|---------------------|-----|
|  DAVID  |   4   |MANAGER    | a      |11/11/2018  |note |
|  JAMES  |   1   |DELIVERYMAN| b      |05/05/2015  |note |
|  OLIVER |   1   |DRIVER     | b      |02/02/2014  |note |
|  SAM    |   2   |ACOUNTS    | c      |10/10/2016  |note |

Какой лучший запрос мог бы дать мне этот результат?

см. Столбцы [c_name],[Deli_Date] они показывают последние вставленные данные.или просто дайте мне результат без [c_name],[Deli_Date] все нормально.

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

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

select d.Employee, d.cnt, d.Post, d.c_name, d.Deli_Date, d.Note 
from (select d.*,
             count(*) over (partition by employee) as cnt,
             row_number() over (partition by employee order by deli_date desc) as seqnum
      from delivery d
     ) d
where seqnum = 1;
0 голосов
/ 02 июня 2018
select Employee, count(Employee) as TIMES,Post,c_name,Deli_Date,Note from delivery
group by Employee
0 голосов
/ 02 июня 2018

Вам необходимо включить все неагрегированные столбцы в пункты выбора и группировки по пунктам

select Employee,
  count(Employee) as TIMES,
  max(Deli_date) as LAST_DELI_DATE,
  post,
  note
from delivery
group by Employee, post, note

Макс (Deli_date) даст вам самую последнюю дату.

Чтобы получить самую последнююc_name, note, post и т. д. вам потребуется подзапрос с функцией ранга, отсортированной по дате гастронома.Я добавлю пример позже.

...