gpt4 book ai didi

asp.net - 在 SELECT 子句中显示不同 COUNT 的存储过程

转载 作者:行者123 更新时间:2023-12-03 21:56:37 24 4
gpt4 key购买 nike

我已经尝试了好几个小时来解决问题,但我还没有找到合适的解决方案。

我在 SQL Server 中有一个名为 EmailTask​​s 的表:

 Id  | HasFailed | CreateDate
19 | 1 | 10/11/2011
29 | 0 | 09/11/2011
15 | 1 | 14/12/2011

我想构建一个接受两个参数的存储过程:@beginDate@endDate

它从EmailTask​​s表中选择相关记录(即@beginDate@endDate之间的CreateDate)并返回包含 3 列的下表:

  1. TotalEmails:邮件总数,
  2. Failed:失败的邮件数量(hasFailed = 1),
  3. Suceess:成功的邮件数量(hasFailed = 0)。

例如:sp_GetEmailTemplateStatistics('08/11/2011', '11/11/2011') 将返回:

TotalEmails | Failed | Suceess
2 | 1 | 1

请注意:Id=15 的记录不计算在内,因为 CreateDate (14/12/2011) 大于参数 @endDate.

最佳答案

你总是可以这样做:

select 
(select count(*) from EmailTasks
where CreateDate between @beginDate and @endDate)
as TotalEmails,
(select count(*) from EmailTasks
where CreateDate between @beginDate and @endDate
and HasFailed = 1)
as Failed,
(select count(*) from EmailTasks
where CreateDate between @beginDate and @endDate
and HasFailed = 0)
as Suceess

这将返回正确的值,但会针对表执行三次,并且它的条件重复了三次,因此如果修改逻辑,可能会出现粘贴错误。

如果 HasFailed 始终为 0 或 1(一个 bit 字段),您可以这样做更聪明但不太清晰的解决方案:

  select 
count(*) as TotalEmails,
sum(cast(HasFailed as int)) as Failed,
sum(1-cast(HasFailed as int)) as Suceess
from EmailTasks
where CreateDate between @beginDate and @endDate
  • 强制转换是必要的,因为 sum 运算符在 bit 字段上无效,正如 Martin Smith 所指出的那样

关于asp.net - 在 SELECT 子句中显示不同 COUNT 的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8504184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com