SQL Server:计算组中的不同日期

时间:2016-03-09 02:27:36

标签: sql-server greatest-n-per-group

我还是SQL新手,所以我可能做错了,但是......

我需要明确预约日期。因此,对于cust.id 1,John应该有3个约会日期,Sara应该有2个约会的约会日期。

临时表(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

4 个答案:

答案 0 :(得分: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

我认为上面的代码可以帮到你。

答案 1 :(得分:0)

从PARTITION BY中移除APPT_DATE

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

编辑1:更改为交叉应用(不允许带有OVER()的DISTINCT)

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

答案 2 :(得分: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

答案 3 :(得分:0)

我从评论中看到,日期计数应该由cust_idemp_id来区分。.

SELECT cust_id
       ,emp_name
       ,emp_id
       ,oat1.Count_Appt_Date
       ,APPT_DATE
       ,Procedure_Code 
FROM #EC
OUTER APPLY (SELECT ec2.cust_id
                  , ec2.emp_id
                  , COUNT(DISTINCT(CONVERT(date, ec2.[APPT_DATE]))) AS Count_Appt_Date
             FROM #EC ec2
             WHERE ec2.cust_id = #EC.cust_id
               AND ec2.emp_id = #EC.emp_id
             GROUP BY ec2.cust_id, ec2.emp_id) oat1
ORDER BY cust_id