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_id
和 emp_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 中按日期列排序的组中对列进行排名