SQL количество одного поля в совокупности другого поля - PullRequest
0 голосов
/ 08 января 2020

Мне нужно подсчитать общее количество единиц, независимо от каких-либо критериев, но также пометить людей, которые выполнили более 3 единиц работы за определенную дату.

Вот пример таблицы и псевдокода:

DATE|PERSON|JOB_NO
1/1/2020 | M | 01
1/1/2020 | M | 02
1/1/2020 | N | 03
1/1/2020 | M | 04

псевдокод:

SELECT DATE, COUNT(ALL UNITS), COUNT(DISTINCT PERSON WHERE PERSON DID MORE THAN 3+ UNITS)
FROM DB
GROUP BY DATE

Итак, из таблицы M выполнили 3 задания, поэтому они считают, а N - 1, поэтому я не получу:

1/1/2020 | 4 | 1

Ответы [ 5 ]

1 голос
/ 08 января 2020

Я думаю, что кто-то уже ответил на этот вопрос правильно, но вот я go

drop  table #tmp

create table #tmp
    (
        [date] date
        , person char(1)
        , jobno int
    );

insert into #tmp
( date, person, jobno )
values ('1/1/2020', 'm',1), ('1/1/2020', 'm',2), ('1/1/2020', 'n',1), ('1/1/2020', 'm',3)

SELECT
    DATE,
    COUNT(*),
    (SELECT COUNT(distinct person) FROM #tmp GROUP BY person, date HAVING COUNT(*)>=3)
FROM #tmp
GROUP BY DATE
0 голосов
/ 09 января 2020

Используйте два уровня агрегации:

select date, sum(cnt) as total_units,
       sum(case when cnt >= 3 then 1 else 0 end) as persons_with_3
from (select date, person, count(*) as cnt
      from t
      group by date, person
     ) dp
group by date
order by date;
0 голосов
/ 08 января 2020

Используйте COUNT() оконную функцию, чтобы получить людей, которые завершили 3+ юнитов, а затем агрегировали:

SELECT t.[DATE], COUNT(*) [ALL UNITS],
  COUNT(DISTINCT CASE WHEN t.counter >=3 THEN [PERSON] END) [DISTINCT PERSON]
FROM (  
  SELECT *, COUNT([JOB_NO]) OVER (PARTITION BY [DATE], [PERSON]) counter
  FROM tablename
) t
GROUP BY t.[DATE]

См. Демоверсию . Результаты:

> DATE                | ALL UNITS | DISTINCT PERSON
> :------------------ | --------: | --------------:
> 01/01/2020 00:00:00 |         4 |               1
0 голосов
/ 08 января 2020

Вот пример для подсчета в sql, если вам нужно посмотреть, где отсчет 3 +

SELECT d.nume,
FROM angajat a JOIN departament d ON a.departament_id = d.id_dep
GROUP BY d.nume
HAVING COUNT (d.nume) <= 3;
0 голосов
/ 08 января 2020

Вы можете использовать два уровня агрегации для вычисления ежедневного количества людей, которые выполнили 3+ задания:

select date, count(*) cnt
from (select date, person from mytable group by date, person having count(*) >= 3) t
group by date

Внутренний запрос выбирает кортежи (date, person), которые имеют более 3 записей в Таблица. Внешний запрос подсчитывает количество таких записей в день.

...