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

Posted

技术标签:

【中文标题】SQL Server:计算组中的不同日期【英文标题】:SQL Server: Count distinct dates in a group 【发布时间】:2016-06-23 06:00:49 【问题描述】:

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

我需要对约会日期进行明确计数。所以 cust.id 1 的 John 应该有 3 个约会日期,而 Sara 应该有 cust.id 1 的 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

【问题讨论】:

但是为什么你的 Procedure_Code 被改变了? 您希望按客户 ID 或员工 ID 明确计算应用日期?您的描述是“cust id”,但您的结果看起来像是“emp id”。编辑:看起来都像!正确吗? @Loser 客户进来完成不同的事情。例如,如果你有一天去汽车修理店买新的刹车片,然后换油。希望这是有道理的 @Squirrel 是的,两者都是!抱歉没有具体说明 【参考方案1】:

我从 cmets 中看到,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

【讨论】:

【参考方案2】:

下面的内容可能会有所帮助:

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】:

从 PARTITION BY 中删除 APPT_DATE

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

编辑 1:更改为 CROSS APPLY(不允许使用 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

【讨论】:

Use of DISTINCT is not allowed with the OVER clause. 哦。 .忘记了【参考方案4】:
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

我觉得上面的代码可以帮到你。

【讨论】:

以上是关于SQL Server:计算组中的不同日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server日期计算

SQL Server 查询需要从组中提取数据

计算列组中的列数

如何在 SQL Server 中按日期列排序的组中对列进行排名

如何在 SQL Server 中的滑动窗口上聚合(计算不同的项目)?

在 SQL 中计算不同日期之间 sum() 的差异