2016-03-09 5 views
1

Я еще новичок в SQL, так что я, возможно, делают это неправильно, но ...SQL Server: Количество различных дат в группе

мне нужно, чтобы получить подсчет различных дат назначения. Так Джон для cust.id 1 должен иметь счетчик 3 даты назначения и Сара должна иметь счетчик 2 даты назначения для cust.id 1.

Temp таблица (EC):

|cust.id | emp_name | emp_id | APPT_DATE | Procedure_Code | something1| 
|:------:|:--------:|:------:|:--------------:|:--------------:|:---------:| 
| 1 | john | 100 | 2/2 00:00:00 |  a0  | w/e | 
| 1 | john | 100 | 2/3 00:00:00 |  b1  | w/e | 
| 1 | john | 100 | 2/4 00:00:00 |  c2  | w/e | 
| 1 | Sara | 200 | 2/2 00:00:00 |  d3  | w/e | 
| 1 | Sara | 200 | 2/3 00:00:00 |  e4  | w/e | 

Ответ Я ищу:

| cust.id | emp_name | emp_id | CNT | APPT_DATE | Procedure_Code | 
|:-------:|:--------:|:------:|:---:|:-------------:|:--------------:| 
| 1 | john | 100 | 3 | 2/2 00:00:00 |  a0101  | 
| 1 | john | 100 | 3 | 2/3 00:00:00 |  b1234  | 
| 1 | john | 100 | 3 | 2/4 00:00:00 |  c0101  | 
| 1 | Sara | 200 | 2 | 2/2 00:00:00 |  d0101  | 
| 1 | Sara | 200 | 2 | 2/3 00:00:00 |  e1234  | 

Мой код:

SELECT cust_id 
     ,emp_name 
     ,emp_id 
     ,COUNT(DISTINCT APPT_DATE) 
      OVER (PARTITION BY cust_id, APPT_DATE) AS CNT 
     ,APPT_DATE 
     ,Procedure_Code 
FROM #EC 
ORDER BY cust_id 
+1

Но почему ваша процедура_Кода меняется? – Kason

+0

Вы хотели, чтобы отчетный счетчик даты был указан cust id или emp id? В вашем описании указано «cust id», но ваш результат выглядит так: «emp id». EDIT: выглядит как и то, и другое! верный ? – Squirrel

+0

@ Клиенты Loser приходят, чтобы сделать разные вещи. Например, если вы однажды заходите в авторемонт, чтобы получить новые тормозные колодки, а затем получите смену масла. Надеюсь, что имеет смысл – AAlex

ответ

0
select a.*,b.CNT 
from(
    SELECT cust_id 
      ,emp_name 
      , 
      ,APPT_DATE 
      ,Procedure_Code 
    FROM #EC 
    ) as a inner join (select count(distinct appt_date)as cnt, emp_id from #EC group by emp_id)as b 
    on a.emp_id = b.emp_id 

Я думаю, что приведенный выше код может вам помочь.

0

удалить APPT_DATE из PARTITION BY

COUNT(DISTINCT APPT_DATE) 
      OVER (PARTITION BY cust_id) AS CNT 

EDIT 1: изменение CROSS ОТНОСИТЬСЯ (DISTINCT с OVER() не допускается)

FROM #EC e 
CROSS APPLY 
(
    SELECT COUNT(DISTINCT APPT_DATE) as CNT 
    FROM #EC x 
    WHERE x.cust_id = e.cust_id 
    AND x.emp_id = e.emp_id 
) c 
+0

'Использование DISTINCT не допускается с предложением OVER. ' –

+0

oh. , забыл об этом – Squirrel

0

Может быть что-то вроде ниже должно помочь:

select ec.cust_id, ec.emp_name, ec.emp_id, t.cnt, ec.APPT_DATE, ec.Procedure_Code 
from #EC ec 
join 
(
    SELECT cust_id, emp_id ,COUNT(distinct APPT_DATE) CNT 
    FROM #EC 
    group BY cust_id, emp_id 
) t 
on ec.cust_id = t.cust_id and ec.emp_id = t.emp_id 
Смежные вопросы