SQL组(按天,含计数)

SQL组(按天,含计数),sql,sql-server,group-by,aggregate,Sql,Sql Server,Group By,Aggregate,我在SQL Server中有一个日志表,如下所示: CREATE TABLE [dbo].[RefundProcessLog]( [LogId] [bigint] IDENTITY(1,1) NOT NULL, [LogDate] [datetime] NOT NULL, [LogType] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [RefundId] [int] NULL, [RefundTypeId]

我在SQL Server中有一个日志表,如下所示:

CREATE TABLE [dbo].[RefundProcessLog](
 [LogId] [bigint] IDENTITY(1,1) NOT NULL,
 [LogDate] [datetime] NOT NULL,
 [LogType] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 [RefundId] [int] NULL,
 [RefundTypeId] [smallint] NULL,
 [LogMessage] [varchar](1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 [LoggedBy] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 CONSTRAINT [PK_RefundProcessLog] PRIMARY KEY CLUSTERED 
(
 [LogId] ASC
) ON [PRIMARY]
) ON [PRIMARY]

GO
我想要的是一个结果列表,它表示每天处理多少个不同的退款ID,去掉任何空值

我需要编写什么样的SQL来生成这些结果

Select count(*), LogDate, refundid from RefundProcessLog
where refundid is not null
group by LogDate, refundid
编辑:


或者,如果您不希望在SqlServer中按退款细分,请删除退款ID,它将类似于:

select datepart(YEAR, [LogDate]), datepart(MONTH, [LogDate]), datepart(DAY, [LogDate]), count(refundid) as [Count]
from [RefundProcessing]
group by datepart(YEAR, [LogDate]), datepart(MONTH, [LogDate]), datepart(DAY, [LogDate])

您使用的是哪家数据库供应商?无论是哪种情况,请使用适当的解释替换以下中的“DateOnly(LogDate)”,以从LogDate列值中提取日期部分(去掉时间),然后尝试以下操作:

Select [DateOnly(LogDate)], Count Distinct RefundId
From RefundProcessLog
Group By [DateOnly(LogDate)]
例如,在Sql server中,适当的构造应为:

Select DateAdd(day, 0, DateDiff(day, 0, LogDate)), Count(Distinct RefundId)
From RefundProcessLog
Group By DateAdd(day, 0, DateDiff(day, 0, LogDate))
“DateOnly”是特定于SQL数据库的,您尚未指定

对于SQL Server,您可以将DateAdd(dd,0,DateDiff(dd,0,LogDate))用于“DateOnly”

根据您使用的SQL方言,您可能必须将强制转换更改为其他类型。表达式应将LogDate转换为仅限日期的值

另外,如果您说“不同的退款ID”,因为可能有重复的退款ID值,您只想计数一次,请使用计数(不同的退款ID)

我喜欢(MS SQL)中的这种方法:


SQL Server 2008引入了
日期
数据类型,使以下功能成为可能:

select convert(date, LogDate),
      ,count(refundid) AS 'refunds'
  from RefundProcessing
group by convert(date,LogDate)
order by convert(date,LogDate)

这行不通。它将返回一行,其中包含RETUREID的每个不同值的计数,这不是所需的。您可能希望在结果集中包含日期。如前所述,这将给出退款ID的数量,但无法知道哪一个数字发生在哪一天。此解决方案的性能应远远优于公认的解决方案,其中涉及字符串转换。@James同意性能与字符串转换。但是你(或任何人)知道使用DateAdd(day,0,DateDiff(day,0,LogDate))的charles bretana的解决方案的性能吗@Fonnae,我还没有测量过,但我希望这比另一个答案稍微快一点,因为这是在进行一些通用的日期操作(可能比这个CAST慢),我很确定这些操作会产生一个完整的日期时间,以午夜为时间,而这个解决方案使用较小的日期类型进行分组,这应该会更快。
select cast(LogDate as date) as LogDate, count(refundId) as refundCount
from yourTable
group by cast(LogDate as date)
SELECT 
  Convert(char(8), LogDate, 112),
  count(distinct RefundId)
FROM RefundProcessing
GROUP BY Convert(char(8), LogDate, 112)
select convert(date, LogDate),
      ,count(refundid) AS 'refunds'
  from RefundProcessing
group by convert(date,LogDate)
order by convert(date,LogDate)